Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php正则表达式发现太多_Php_Regex_Preg Replace_Regex Negation - Fatal编程技术网

php正则表达式发现太多

php正则表达式发现太多,php,regex,preg-replace,regex-negation,Php,Regex,Preg Replace,Regex Negation,我想打开这个:[title->link] 对此: 所以我有这行代码 $content = preg_replace('/\[(.*)\-\>(.*)\]/', '<a target="_blank" href="$2">$1</a>', $content); $content=preg\u replace('/\[(.*)\-\>(.*)\]/',''.$content); 在上,它运行良好,但在我的代码中不起作用。 问题是它将“[”字符计算为普通字符,因为如

我想打开这个:
[title->link]
对此:

所以我有这行代码

$content =  preg_replace('/\[(.*)\-\>(.*)\]/', '<a target="_blank" href="$2">$1</a>', $content);
$content=preg\u replace('/\[(.*)\-\>(.*)\]/',''.$content);
在上,它运行良好,但在我的代码中不起作用。 问题是它将“[”字符计算为普通字符,因为如果第一个(.*),那么第一个组可能会很长,如果前面有另一个“[”

bla bla[…]bla bla[标题->链接] 这里的黑体是我的第一组,但它不是我想要的


如何使第一个组停止,因为第一个“[”是第一个组?

您想使用
[^]*
而不是
*
[^]
捕获所有不是
]
的内容,这样它在捕获第一个或第二个组时就不会传递
]
,从而防止出现问题。这不会保护<代码> [BLLA BL[标题]-Link ]<代码>,包括在第一个捕获组中的“BLA BLA[]”,如果可能发生这种嵌套,请考虑将< <代码> [<代码> ]添加到否定组<代码> [^ ]] /<代码> < /P>
\[([^]]*)->([^]]*)\]


编辑:指出
-
]
不需要在这里转义,但我选择将
]
保留为转义,因为它有时在正则表达式中可能有特殊含义。

也不需要最后的
]
。如果有
[
以前。在这种情况下,没有。不过,不要紧,正则表达式引擎通常对太多转义非常友好,如果我不想让它成为特殊的,我会留下一个可能是特殊的,也可能不是特殊的字符总是转义。这只会伤害眼睛。但实际上,这取决于引擎。例如,在Vim默认情况下,
\[
是字符类。非转义是文本。字符需要转义或不转义取决于上下文。对于PHP,
-
是一个特殊的类,只要前面有一个
[
。与
]
相同。所以我投票支持
\[a \-b\]
\[a-b]
。两者都是相同的:)但是让我们把这个留给读者来解释。谢谢你的参考资料和漂亮的答案!