我正在使用正则表达式使用以下PHP代码检测Twitter流中的@replies。
$text = preg_replace('!^@([A-Za-z0-9_]+)!', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
$text = preg_replace('! @([A-Za-z0-9_]+)!', ' <a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
我如何才能最好地将这两条规则结合起来,而不会将email @domain.com作为回复?
答案 0 :(得分:4)
好的,再想一想,没有标记@ email就意味着前一个元素必须是一个“非单词”项,因为一个单词中可能包含的任何其他元素都可以作为电子邮件发出信号,所以它会导致:
!(^|\W)@([A-Za-z0-9_]+)!
但是你必须使用2美元而不是1美元。
答案 1 :(得分:2)
由于^
不必站在RE的开头,您可以使用分组和|
来组合这些RE。
如果您不想重新插入捕获的空白,则必须使用“正面观察”:
$text = preg_replace('/(?<=^|\s)@(\w+)/',
'<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
或“负面看后”:
$text = preg_replace('/(?<!\S)@(\w+)/',
'<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
......无论你发现哪个更容易理解。
答案 2 :(得分:0)
以下是我如何进行组合
$text = preg_replace('!(^| )@([A-Za-z0-9_]+)!', '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
答案 3 :(得分:-1)
preg_replace('%(?<!\S)@([A-Za-z0-9_]+)%', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
(?<!\S)
被宽泛地翻译为“没有先前的非空白字符”。排序为双重否定,但也可以在字符串/行的开头处起作用。
这不会消耗任何前面的字符,不会使用任何捕获组,也不会匹配"foo-@host.com"
这样的字符串,这是一个有效的电子邮件地址。
测试:
Input = 'foo bar baz-@qux.com bee @def goo@doo @woo'
Output = 'foo bar baz-@qux.com bee <a href="http://twitter.com/def" target="_blank">@def</a> goo@doo <a href="http://twitter.com/woo" target="_blank">@woo</a>'
答案 4 :(得分:-1)
$text = preg_replace('/(^|\W)@(\w+)/', '<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
答案 5 :(得分:-2)
我认为你可以使用替换,所以寻找字符串或空格的开头
'!(?:^|\s)@([A-Za-z0-9_]+)!'
答案 6 :(得分:-2)
胡,伙计们,不要推得太远......这是:
!^\s*@([A-Za-z0-9_]+)!