我有这个:
<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。答案 0 :(得分:1)
这不容易,但这可能会做你想要的。
'<span.+?style=(\'|\")color\:(.+?)\1[^>]*>(.+?)(?=\<\/span\>)<\/span>'
并为替换
'[color=$2]$3[/color]'
https://regex101.com/r/rE1oR3/4
解释
\<span
匹配文字.+?
匹配任何非贪婪的style=
匹配文字(\'|\")
匹配单引号或双引号,捕获组1我们将使用后者(.+?)
匹配并捕捉任何非贪婪的内容\1
支持先前匹配的报价方式[^>]*
匹配不是&gt; >
匹配文字(.+?)
匹配并捕捉任何非贪婪的内容(?=\<\/span\>)
正向前瞻锚定非贪婪匹配,非常类似于style=
或\1
位,但确保它与遇到的第一个</span>
匹配。 / LI>
<\/span>
匹配文字