我有一个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
答案 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&type=news&ID=2&lang=ru&find_section_section=-1&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&type=news&ID=2&lang=ru&find_section_section=-1&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);