2013-08-06 2 views
4

Я получил эту картину (я использую PHP):Php, регулярное выражение

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?)\]/i' 

Когда я искать эту строку: http://phpquest.zapto.org/users/register.php

спички (заказ 0-5):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. ''

Когда я заменить * с + внутри последней подмаски так:

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)*\/?)\]/i' 

спички (заказ 0-5):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. '/users/register.php'

Если кто-нибудь может помочь мне понять, почему это я буду очень благодарен, спасибо всем, и есть прекрасный день.

+0

'why is that' - попробуйте задать свой вопрос. – MightyPork

+4

Почему вы не используете 'parse_url'? Не изобретайте велосипед, мы знаем, как они работают. – Halcyon

+0

Я могу использовать его, но я действительно хочу понять причину, спасибо –

ответ

3

Возможно, более простой пример: при сравнении this с this.

регулярных выражений вовлеченные:

(a*)* 

и

(a+)* 

И тест строка aaaaaa.

Что происходит, так это то, что после захвата основной группы (в примере, который я предоставил, серия a), он пытается сопоставить больше, но не может. Но ждать!Он также может не совпадать, потому что * означает 0 или более раз!

Таким образом, после сопоставления всех a, он будет соответствовать и поймать «ничего», и поскольку сохраняется только последняя захваченная часть, вы получаете «» в результате группы захвата.

В (a+)*, после согласования и ловли aaaaaa, он может не соответствовать или поймать что-нибудь еще (+ мешает ему не соответствовать ничего, в отличие от *) и, следовательно, aaaaaa последний матч.

+0

Джерри так благодарит сейчас, я понял, хорошо объяснил ответ еще раз и хорошо провел день. –

+0

@uBlankText Добро пожаловать :) – Jerry

2

Это может быть упрощено с помощью следующей схемы.

/\[link=(https?:\/\/)(([a-z0-9]+\.?)+)((\/[^\/]+)+)\/?\]/i 

Символ регулярное выражение * не жадный, в то время как + есть. Следовательно, при использовании во второй попытке + все компоненты пути согласованы и эта группа захвачена; однако в первой попытке с *, поскольку вы только фиксировали внутреннюю группу * с круглыми скобками, вы сопоставили нежелательный образец *, в этом случае ничего.

+0

Спасибо, матовый, Но не могли бы вы объяснить, почему шаблон на моем вопросе не показывает последний подшаблон на * и с + it doe's. –

+0

Это не ответ на вопрос, не так ли? Автор спросил: «Почему он ведет себя так?» не «Как сделать это лучше» – mondjunge

Смежные вопросы