preg_replace与模式和HTML标签不起作用

时间:2015-08-16 19:08:53

标签: php

我有这个:

<span style="color:#ff8c00;"><strong>Benjamin Franklin</strong></span>
or
<span style="color:#ff8c00;"><strong><em>Benjamin Franklin</em></strong></span>
or
<span style="color:#ff8c00;">Benjamin Franklin</span>

我需要回报:

[color=#ff8c00]<strong>Benjamin Franklin</strong>[/color]
[color=#ff8c00]<strong><em>Benjamin Franklin</em></strong>[/color]
[color=#ff8c00]Benjamin Franklin[/color]

我在PHP中有这种模式

~<span\s[^>]*\bstyle=[\'\"]color\:([\#a-zA-Z0-9\(\)\,]+)\;[\'\"]>([\<a-z0-9\>]+)(.+?)\s([\<\/a-z0-9\>]+)<\/span>~is

但效果不佳,尽管在RegExr节目中有作品http://regexr.com/3bjis

这会在PHP中返回我:

[/[color=#Benjamin Franklin

PHP

$text = preg_replace(
    array(
        '~<span\s[^>]*\bstyle=[\'\"]color\:([\#a-zA-Z0-9\(\)\,]+)\;[\'\"]>([\<a-z0-9\>]+)(.+?)([\<\/a-z0-9\>]+)<\/span>~is',    
    ),
    array(
      '[color=$1]$2$3$4[/color]',
    ), ltrim($text));

echo $text;

问候。

编辑:我的问题非常不同,我的模式在上面发布的RegExr链接中工作得非常好,但在PHP回显中返回错误,我真的不想使用XPath。

1 个答案:

答案 0 :(得分:1)

这不容易,但这可能会做你想要的。

'<span.+?style=(\'|\")color\:(.+?)\1[^>]*>(.+?)(?=\<\/span\>)<\/span>'

并为替换

'[color=$2]$3[/color]'

https://regex101.com/r/rE1oR3/4

解释

  • \<span匹配文字
  • .+?匹配任何非贪婪的
  • style=匹配文字
  • (\'|\")匹配单引号或双引号,捕获组1我们将使用后者
  • `color:match literal
  • (.+?)匹配并捕捉任何非贪婪的内容
  • \1支持先前匹配的报价方式
  • [^>]*匹配不是&gt;
  • 的任何内容(包括空)
  • >匹配文字
  • (.+?)匹配并捕捉任何非贪婪的内容
  • (?=\<\/span\>)正向前瞻锚定非贪婪匹配,非常类似于style=\1位,但确保它与遇到的第一个</span>匹配。 / LI>
  • <\/span>匹配文字