我有一个字符串,它可能包含如下模式:
LINK([anchor text],[link])我想要做的是将这个表达式转换成一个HTML链接:
<a href="link">anchor text</a>目前,我正在用以下PHP片段来替换:
$string = 'LINK( some anchor text , http://mydomain.com )';
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
$replace = '<a href="$2">$1</a>';
preg_replace($search, $replace, $string);我面临的问题是锚文本后面的空格。幸运的是,在HTML中,多个空格被解释为单个空格,但在本例中,我将显示一个带有(带下划线的)恼人空间的链接。有什么方法可以修剪这个锚文本吗?我不能把它当作“链接”子字符串,因为它可能包含空格。
发布于 2014-01-07 15:37:34
假设锚文本不能包含逗号或一行中超过一个空格,则可以使用:
LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)我使用的不是.+,而是[^\s,]+(?:\s[^\s,]+)*,它将匹配一个单词,更多的单词由空格分隔(其中一个单词是一系列至少有一个字符的非空格字符)。
还将被否定的类[^\s]更改为\S。
发布于 2014-01-07 15:51:52
发布于 2014-01-07 15:52:43
在这种情况下,您可以做的是将第一组更改为懒惰地分组。
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';可改为:
$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';注意加号后面的问号。这告诉程序使用最少的字符数来匹配它。
在这种情况下,它可以匹配的最懒的是一个字符串,后面跟着任意数量的空格,然后是逗号。
在最初的情况下,这将是贪婪的匹配。这意味着它将尝试匹配尽可能多的字符,从而导致.+匹配逗号以下的所有字符。
这是代码的一个regex101。
https://stackoverflow.com/questions/20975544
复制相似问题