2014-11-05 4 views
-1

У меня есть следующее регулярное выражение, которое я пытаюсь обнаружить #x, x - число. Я смог заставить его работать, когда вокруг матча нет ничего, но если это произойдет, то он сломается. может ли кто-нибудь помочь мне в том, как сделать эту работу в обоих направлениях?php regex для обнаружения #number

/(\G|\s+|^)#(\d+)((?=\s+)|(?=::)|$)/i 

, который будет работать с линией

This is a test #1234 end test 

, но это не будет работать с

This is a test #1234end test 
This is a test#1234 end test 
This is a test.#1234 end test 
This is a test #1234. End test 

кого знают, что нужно изменить, чтобы достичь этого?

редактирование, я пытаюсь разрешить что угодно, кроме буквенно-цифровой в третьей группе, прямо сейчас есть :: и пробелы. есть способ объединить их в 1 и не обнаруживать буквы или цифры

+6

Почему бы просто не использовать '/ # (\ d +) /'? – anubhava

+2

Ваша попытка подсказывает, что у вас есть некоторые отрицательные случаи. Что ** не ** вы хотите совместить? – bishop

ответ

0
(\G|\s+|^)#(\d+)((?=[^[:alnum:]])|$) 

Я хотел сохранить три группы, которые у меня были, но я только изменил третью группу. Я удалил символы пробелов :: и \ S из третьей группы и просто добавил простую НЕ-буквенно-цифровую проверку, так как это будет содержать эти 2 условия.

(\G|\s+|^) 
#(\d+) 
((?=[^[:alnum:]])|$) 

[^[:alnum:]] 
+0

Этот ответ находится в очереди просмотра сообщений низкого качества, потому что это просто код без объяснений. Пожалуйста, улучшите свой ответ, объяснив, что делает ваш код и как он отвечает на вопрос. Пожалуйста, прочитайте [этот совет, чтобы ответить на вопросы программирования) [http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx). –

+0

@AdiInbar. Как и этот http://stackoverflow.com/a/26759844/, это не должно давать более высокие члены rep. Что этот парень почти никогда не дает никаких объяснений в своих ответах. –

+0

@ Fred-ii- Я не совсем уверен, что вы пытаетесь сказать, но это мой комментарий к запасу, когда я сталкиваюсь с ответами только на код в обзоре LQP. Некоторые кодовые ответы по своему характеру действительно не требуют объяснений, потому что само собой разумеется, как они решают проблему, но я не думаю, что это так. Вот недавний пример моей идеи, как ответить на вопрос регулярного выражения: http://stackoverflow.com/a/26575011/1248365. В любом случае, оставляю ли я этот комментарий для обзора, не зависит от того, насколько высок репутация плаката. –

2

Выполнение предварительного матча с использованием /#\d+/i должно получить то, что вы ищете. Так работает следующим образом:

$items = [ 
    "This is a test #1234end test", 
    "This is a test#1234 end test", 
    "This is a test.#1234 end test", 
    "This is a test #1234. End test" 
]; 

foreach($items as $test){ 
    preg_match("/#\d+/i", $test, $matches); 
    var_dump($matches); 
} 

Вы получите этот результат:

array(1) { 
    [0]=> 
    string(5) "#1234" 
} 
array(1) { 
    [0]=> 
    string(5) "#1234" 
} 
array(1) { 
    [0]=> 
    string(5) "#1234" 
} 
array(1) { 
    [0]=> 
    string(5) "#1234" 
} 

Если вы не хотите # в результатах, то вы можете сделать подмаски /#(\d+)/i

В результате чего получится следующее:

array(2) { 
    [0]=> 
    string(5) "#1234" 
    [1]=> 
    string(4) "1234" 
} 
array(2) { 
    [0]=> 
    string(5) "#1234" 
    [1]=> 
    string(4) "1234" 
} 
array(2) { 
    [0]=> 
    string(5) "#1234" 
    [1]=> 
    string(4) "1234" 
} 
array(2) { 
    [0]=> 
    string(5) "#1234" 
    [1]=> 
    string(4) "1234" 
} 
Смежные вопросы