【问题标题】:Regex results in "Delimiter must not be alphanumeric or backslash" [duplicate]正则表达式导致“分隔符不能是字母数字或反斜杠”[重复]
【发布时间】:2013-08-25 16:11:34
【问题描述】:

我有这个代码

function a($menu_item, $remove_link) {
    $pattern = 'class="(.+)"(.+)<a.+>(.+)</a>';
    if($remove_link) {
        return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); //<- line 6
    }
    return $menu_item;
}

这基本上检查$remove_link是否为真,然后删除链接并将类定义添加到$menu_item

例如,如果我使用

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>';
$menu_item = a($menu_item, true);

它应该返回

<li class="menuitem first selected">Home</li>;

正则表达式已经过测试,它可以在 Notepad++ 中运行,但我的函数给出了这个错误:

Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in functions.php on line 6

我看到 php 模式必须用斜杠“分隔”,所以我尝试使用 class="/(.+)"(.+)&lt;a.+&gt;(.+)/&lt;/a&gt; 代替,但它给出了相同的错误。

我错过了什么?如何正确使用分隔符?

【问题讨论】:

标签: php regex delimiter


【解决方案1】:

您必须在模式的开头和结尾放置模式分隔符,例如:

$pattern = '#class="(.+)"(.+)<a.+>(.+)</a>#';

这里# 是比/ 更好的选择,因为您避免转义模式中的所有斜线,但您可以编写:

$pattern = '/class="(.+)"(.+)<a.+>(.+)<\/a>/';

顺便说一句,你的模式会导致很多回溯:

$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</a>~';

会更好。

请记住,+* 在默认情况下是贪婪量词(即,它们会尽其所能)。

如果我使用受限字符类而不是点,我可以阻止量词的贪婪,例如

[^"]+ 获取除" 之外的所有字符,因此在找到" 时停止。

演示:

<?php
function a($menu_item, $remove_link) {
    //$pattern = '~class="(.+)"(.+)<a.+>(.+)</a>~';
    $pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)<\/a>~';
    if($remove_link) {
        return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item);
    }
    return $menu_item;
}

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>';
echo a($menu_item, true);

【讨论】:

  • 它消除了错误,但文本没有被替换。为什么?
  • 刚刚检查了您的更新,它不起作用。 你的模式是假的是什么意思?你的意思是错了吗?我用记事本++检查了它,还做了一个使用相同正则表达式的小java程序,它可以工作,为什么它不能与PHP一起工作? p.s.但是,您的正则表达式不起作用。
  • @BackSlash:经过测试,您的模式似乎有效,但会导致许多回溯(正则表达式引擎必须继续查找匹配项)。我在我的模式中用* 替换了+ 量词(因为在示例中,类的末尾和&gt; 之间没有任何内容)
  • 我注意到您的更改,但它对我不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多