【问题标题】:how do I use preg_replace_callback on unknown values?如何在未知值上使用 preg_replace_callback?
【发布时间】:2014-02-07 20:42:01
【问题描述】:

今天我得到了一些很大的帮助,开始了解具有已知值的 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 和 a 标签中删除所有 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>

【问题讨论】:

  • “我将如何使用 preg_replace_callback 到 [...]” - 理想情况下,you wouldn’t ...
  • 所以在这种情况下我应该坚持使用 preg_replace 或 str_replace 吗?
  • 如果你不知道 $string 的未来,最好使用 HTML 解析器
  • A quick fiddle,发布一个广泛的答案很累,所以我放了一些 cmets。将preg_replace()x 修饰符一起使用并删除g 修饰符。一些建议:1) 如果你不确定你得到的输入或者你的正则表达式技能不好,那么就使用a parser 2) 这个问题得到了相当多的支持,我不明白为什么,但你真的应该发布你的尝试 3) Learn regex 或访问 regex chatroom

标签: php regex


【解决方案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

【讨论】:

  • 感谢您提供两者的示例!
【解决方案2】:

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

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

虽然一般来说您最好避免使用正则表达式解析 HTML 并改用适当的解析器(例如将 HTML 加载到 DOMDocument 并使用 removeAttribute 方法,如 @987654322 @)。这样您就可以更好地处理标记和格式错误的 HTML 的变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多