我有一个字符串,其中可能包含如下模式:
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中,多个空格被解释为单个空格,但在此示例中,我将显示带有(带下划线)恼人空间的链接。有没有办法修剪这个锚文本?我不能把它当作“链接”子串,因为它可能包含空格。
答案 0 :(得分:2)
假设锚文本不能包含逗号或连续多于1个空格,您可以使用:
LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)
而不是.+
,我使用的[^\s,]+(?:\s[^\s,]+)*
将匹配一个单词,更多的单词用空格分隔(其中一个单词是一系列至少包含一个字符的非空格字符)
同时更改了您在[^\s]
稍后显示的否定课程\S
。
答案 1 :(得分:1)
答案 2 :(得分:1)
在这种情况下你可以做的是将第一组改为懒惰地分组。
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
可以更改为:
$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';
注意加号后面的问号。这告诉程序使用最少的字符数来匹配它。
在这种情况下,它可以匹配的 laziest 是一个字符串,后跟任意数量的空格,然后是逗号。
在原始情况下,它会匹配贪婪。这意味着它会尝试匹配可能的最大字符数,从而导致.+
匹配所有字符,直到逗号。
以下是代码的a regex101。