要使用简化示例,我有:
$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
[^:] ?`。
答案 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将正则表达式实时发送给可能的字符串。