如何preg_replace重复符号?

时间:2018-04-17 07:58:23

标签: php regex

我有一个HTML内容。在我使用像

之类的代码之后
preg_match('/adm-list-table-cell.*\"del\".*\<\/td/', $content, $zzz);
$new_string = preg_replace('/(\s\/\s)/','',$zzz[0]);
$content = str_replace($zzz[0], $new_string, $content);

搜索字符串 / / / / ALL / / / / / / / / / / 并从中删除所有/。我怎么能只用一个preg_replace函数呢? link on regex

2 个答案:

答案 0 :(得分:1)

StackOverflow解析html的首要建议是使用像DomDocument这样的html解析器。如果您提供有关输入文本可变性的更多信息,我可以编写精确的DomDocument解决方案。

在此期间,这是一个直接的单模式preg_replace()调用,没有不必要的转义,最小的捕获组和贪婪的字符类,以提高效率和简洁性。

代码:(PHP Demo)(Pattern Demo

$html = <<<HTML
<td class="adm-list-table-cell align-right"><a href="iblock_element_edit.php?IBLOCK_ID=1&amp;type=news&amp;ID=2&amp;lang=ru&amp;find_section_section=-1&amp;WF=Y" title="title">2</a></td><td class="adm-list-table-cell align-left adm-list-table-cell-last"> /  /  /  / <span class="del">ALL</span> /  /  /  /  /  /  /  /  /  / </td>
HTML;

echo preg_replace('~adm-list-table-cell.*?\K[/ ]*(<span class="del".*?</span>)[/ ]*~', '$1', $html);

输出:

<td class="adm-list-table-cell align-right"><a href="iblock_element_edit.php?IBLOCK_ID=1&amp;type=news&amp;ID=2&amp;lang=ru&amp;find_section_section=-1&amp;WF=Y" title="title">2</a></td><td class="adm-list-table-cell align-left adm-list-table-cell-last"><span class="del">ALL</span></td>

\K用于&#34;重启&#34;全字符串匹配 - 以便在替换期间不会销毁前面的元素。

在任意字符点(.*?)上使用延迟量词非常重要,以避免&#34;飞过&#34;您的真实内容中的目标子字符串。

如果目标子字符串不需要修剪,正斜杠和空格将被写为具有零个或多个量词的字符类。

P.S。 ...如果我能抽出时间编写DomDocument解决方案,我将编辑我的答案。 (但现在我必须回到我的工作中)

答案 1 :(得分:0)

此preg模式将删除字符串中的所有/

$content = preg_replace('/(adm-list-table-cell[^>]*>)\\s(?:\\/\s+)+(<span class="del".*<\\/span>)\\s(?:\\/\\s+)+(<)/', '${1}${2}${3}', $content);

https://regex101.com/r/yCDvKE/2