匹配任何东西(字符串的开头)或任何字符,但一个\

时间:2012-02-12 01:39:40

标签: php regex pcre

要使用简化示例,我有:

$str = "Hello :special_text:! Look, I can write \:special_text:";
$pattern = /*???*/":special_text:";
$res = preg_replace($pattern, 'world', $str);
$res = str_replace("/:", ":", $res);
$res === "Hello world! Look, I can write :special_text:"; // => true

换句话说,我希望能够“逃避”我正在写的东西。

我认为我的作品几乎正常(使用[^:]?作为模式的第一部分),但我不认为$str === ":special_text:", in that ^ doesn't match [^:] ?`。

3 个答案:

答案 0 :(得分:1)

你可以使用负面的后视:

(?<!\\):special_text:

这表示“替换前面没有反斜杠的:special_text:”。

在您的第二个str_replace看来,您希望将\:替换为:

在行动here中查看。

另外,不要忘记如果在PHP字符串中使用反斜杠,则需要再次转义它们(如果您需要文字\,则需要使用PHP \\,并获取文字\\您需要使用PHP \\\\

$pattern = '@(?<!\\\\):([^:]+):@';

这里@只是一个正则表达式分隔符。

答案 1 :(得分:1)

$pattern = "/[^\\\\]*:special_text:/";

-OR -

$pattern = "/(?<!\\\\):special_text:/";

其他答案没有考虑到在这种情况下超越反斜杠的需要。这有点疯狂。

要匹配文字反斜杠,必须将\\\\写为正则表达式字符串,因为正则表达式必须为\\,并且每个反斜杠必须在字符串文字中表示为\\ 。在反复使用反斜杠的正则表达式中,这会导致大量重复的反斜杠,并使得生成的字符串难以理解。

答案 2 :(得分:0)

这样的事情应该这样做:/[^\\]\:([a-z]+)\:/i

您可以使用RegexPal将正则表达式实时发送给可能的字符串。