как я мог бы объединить эти правила регулярных выражений? - PullRequest
0 голосов
/ 10 февраля 2009

Я обнаруживаю @replies в потоке Twitter с помощью следующего кода PHP с использованием регулярных выражений.

$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?

Ответы [ 7 ]

4 голосов
/ 10 февраля 2009

ОК, если подумать, не помечая @ email, означает, что предыдущий элемент должен быть элементом, не относящимся к слову, потому что любой другой элемент, который может содержаться в слове, может сигнализироваться как электронное письмо, поэтому это привело бы:

!(^|\W)@([A-Za-z0-9_]+)!

но тогда вы должны использовать 2 доллара вместо 1 доллара.

2 голосов
/ 10 февраля 2009

Поскольку ^ не обязательно должен стоять в начале 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);

... что вам проще понять.

0 голосов
/ 10 февраля 2009
$text = preg_replace('/(^|\W)@(\w+)/', '<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
0 голосов
/ 10 февраля 2009

Ху, ребята, не заходите слишком далеко ... Вот оно:

!^\s*@([A-Za-z0-9_]+)!
0 голосов
/ 10 февраля 2009
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>'
0 голосов
/ 10 февраля 2009

Я думаю, что вы можете использовать чередование, так что ищите начало строки или пробела

'!(?:^|\s)@([A-Za-z0-9_]+)!'
0 голосов
/ 10 февраля 2009

Вот как я бы сделал комбинацию

$text = preg_replace('!(^| )@([A-Za-z0-9_]+)!', '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...