我今天得到了一些很好的帮助,开始了解具有已知值的preg_replace_callback。但现在我想解决未知的价值观。
$string = '<p id="keepthis"> text</p><div id="foo">text</div><div id="bar">more text</div><a id="red"href="page6.php">Page 6</a><a id="green"href="page7.php">Page 7</a>';
将其作为我的字符串,我将如何使用preg_replace_callback从div和标签中删除所有id,但是为p标签保留id?
所以从我的字符串
<p id="keepthis"> text</p>
<div id="foo">text</div>
<div id="bar">more text</div>
<a id="red"href="page6.php">Page 6</a>
<a id="green"href="page7.php">Page 7</a>
到
<p id="keepthis"> text</p>
<div>text</div>
<div>more text</div>
<a href="page6.php">Page 6</a>
<a href="page7.php">Page 7</a>
答案 0 :(得分:1)
不需要回调。
$string = preg_replace('/(?<=<div|<a)( *id="[^"]+")/', ' ', $string);
然而,使用preg_replace_callback
:
echo preg_replace_callback(
'/(?<=<div|<a)( *id="[^"]+")/',
function ($match)
{
return " ";
},
$string
);
答案 1 :(得分:0)
对于您的示例,以下内容应该有效:
$result = preg_replace('/(<(a|div)[^>]*\s+)id="[^"]*"\s*/', '\1', $string);
虽然通常你最好避免使用正则表达式解析HTML 并使用正确的解析器(例如将HTML加载到DOMDocument中并使用removeAttribute方法,例如this answer)。这样,您就可以更好地处理标记和格式错误的HTML中的变体。