【问题标题】:Preg_replace to Preg_replace AllPreg_replace 到 Preg_replace 全部
【发布时间】:2015-10-27 06:30:04
【问题描述】:

有人很好地帮助我使用正则表达式进行非常具体的用途,但我现在唯一的问题是正则表达式仅替换匹配的 一个 实例,而不是所有 匹配(这是目标)。

我希望<SPAN>每个实例都带有“stylish-blue-button”类,可以在此处找到:

<span class="stylish-blue-button">
   <span style="display:none;">[data-user="12345" data-userId="678910"]</span>
     John Smith
   <span style="display:none;">[/]</span>
</span>
...Blablabla some other text...

变成这样:

[data-user="12345" data-userId="678910"]John Smith[/] ...Blablabla some other text...

为此,我得到了这个 preg_replace :

preg_replace('~\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*(.*)~s', '<span $1 $2>$3</span>$4', trim(strip_tags($string)));

现在它可以工作了,非常棒,但它只替换了一个实例。

问题:我是否必须彻底改变/改变我的方法才能这样做,还是只是一个小的修改?

非常感谢。

【问题讨论】:

  • Regex 不是解析 HTML/XML 的正确工具,而是使用 DOMDocument
  • @Uchiha 虽然我完全同意,但由于我要做的第一件事是在用户生成的字符串上执行 strip_tags(),这不会破坏尝试解析 HTML 的目的吗?另外,我想,由于我的自定义降价将非常一致,这不会是最糟糕的事情。你还认为我应该进一步推动 DOM Document 吗?

标签: php regex preg-replace markdown


【解决方案1】:
$regex = '~\[(data-user="\d+")\s+(data-userId="\d+")\]\s*(.+?)\s*\[\/\]\s*(.*)~is';

while (preg_match($regex, $string)) {
    $string = preg_replace($regex, "&lt;span $1 $2&gt;$3&lt;/span&gt;$4", trim(strip_tags($string)));
}

echo $string;

【讨论】:

  • 嘿,非常感谢您的建议,但不幸的是,这似乎不起作用。就像我帖子中的正则表达式一样,这只替换第一个实例,而不是全部。
  • 我已经使用 php 根据您的示例和标签获取输出。你可以在在线工具phpfiddle中试试这个。
【解决方案2】:

尝试函数 preg_match_all (http://php.net/preg_match_all)。我希望它就这么简单。

【讨论】:

  • 不幸的是,来自preg_match_all('~\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*(.*)~s', strip_tags($string), $tags);$tags 似乎根本没有给我想要的东西。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 2011-01-27
  • 2017-06-02
  • 1970-01-01
  • 2011-12-10
  • 2014-04-27
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多