【问题标题】:I need a php regular expression that replaces one tag with another我需要一个用另一个标签替换一个标签的 php 正则表达式
【发布时间】:2015-06-30 02:48:01
【问题描述】:
这是我需要做的:
我需要匹配以下标签:
<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>
我需要将 span 替换为符合 html3 的标记,但将文本保留在两者之间。替换后的最终标签应该是这样的:
<u>text sample</u>
我只是不擅长正则表达式,似乎无法找到答案。
提前谢谢你。
【问题讨论】:
标签:
php
html
regex
html-manipulation
【解决方案1】:
正则表达式不是为标签操作而设计的。
如果你有任何形式的嵌套,它会变得一团糟。
但是,鉴于提供的非常简单的示例,您也许可以这样做:
$MyString = preg_replace
( '/(?si)<SPAN\s+style\s*=\s*"TEXT-DECORATION:\s*underline;?"\s*>(.*?)<\/SPAN>/'
, '<u>$1</u>'
, $MyString
);
但这在很多方面都存在缺陷,您最好使用专为处理标签而设计的工具。
看看DOMDocument->loadHTML()和related functions。
【解决方案3】:
你需要这样几行:
preg_replace('|<SPAN style="TEXT-DECORATION: underline">(.+?)</SPAN>|', '<u>$1</u>', $text);
preg_replace('|<SPAN style="FONT-WEIGHT: bold">(.+?)</SPAN>|', '<b>$1</b>', $text);
preg_replace('|<SPAN style="FONT-STYLE: italic">(.+?)</SPAN>|', '<i>$1</i>', $text);
等等。尽管如果标签有可能不会完全匹配那些正则表达式(通常是这种情况,除了非常简单的机器生成的 HTML),使用正则表达式执行此操作会变得异常复杂,并且你最好使用某种解析器。
【解决方案4】:
对于您给出的基本示例。
<?php
$string = '<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>';
$pattern = '/<SPAN style=\"TEXT-DECORATION: underline\">(.+?)<\/SPAN>/';
$replacement = '<u>$1</u>'
echo preg_replace($pattern,$replacement,$string);
?>
会成功的。
模式正则表达式非常简单 - 这正是您正在寻找的内容(带有引号和“/”转义),带有 (.+?) 表示包含所有可能的字符,直到 SPAN 标记结束。这假设您的代码格式一致,您可以在 $pattern 的末尾附加一个 'i' 以使其不区分大小写。
请注意,这并不是真正正确的做法。