如何在未知值上使用preg_replace_callback?

时间:2014-02-07 20:42:01

标签: php regex

我今天得到了一些很好的帮助,开始了解具有已知值的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>

2 个答案:

答案 0 :(得分:1)

不需要回调。

$string = preg_replace('/(?<=<div|<a)( *id="[^"]+")/', ' ', $string);

Live demo

然而,使用preg_replace_callback

echo preg_replace_callback(
    '/(?<=<div|<a)( *id="[^"]+")/',
    function ($match)
    {
        return " ";
    },
    $string
 );

Demo

答案 1 :(得分:0)

对于您的示例,以下内容应该有效:

$result = preg_replace('/(<(a|div)[^>]*\s+)id="[^"]*"\s*/', '\1', $string);

虽然通常你最好避免使用正则表达式解析HTML 并使用正确的解析器(例如将HTML加载到DOMDocument中并使用removeAttribute方法,例如this answer)。这样,您就可以更好地处理标记和格式错误的HTML中的变体。