Как построить строку на основе регулярных выражений и связанных параметров в PHP? - PullRequest
0 голосов
/ 10 марта 2010
(?P<id>\d*)(/(?P<title>.*))?

В большинстве случаев мы используем регулярные выражения для сопоставления чего-либо, но как сгенерировать совпадающую строку, если у нас уже есть id и title?

Например, если id=4 и title='hello world', результат должен быть:

4/hello world

Но если у нас есть только id=4, это должно быть:

4

Потому что, как указывает регулярное выражение, title необязательно.

Два ответа, оба неверно поняты ...

Нет preg_match пока

Ответы [ 4 ]

1 голос
/ 21 марта 2010

Вы предлагаете, что если вы передадите регулярное выражение (?P<id>\d*)(/(?P<title>.*))? функции вместе с параметрами id=4 и title='', функция вернет 4. И это будет работать для любого регулярного выражения. Это просто невозможно. Ваше регулярное выражение является примером, который такая функция никогда не сможет поддерживать.

Если вы вызовете preg_match с регулярным выражением в строке 4, то результаты совпадения вернутся 4 для группы захвата id и пустая строка для группы захвата title. Если вы вызовете preg_match с тем же регулярным выражением для строки 4/, то результаты совпадения также будут 4 для группы захвата id и пустая строка для группы захвата title. PHP не различает группы захвата, которые соответствуют пустой строке, и группы захвата, которые вообще не участвуют в регулярном выражении. Оба возвращают пустую строку. Обратите внимание, что в своем регулярном выражении вы не только сделали группу необязательной с вопросительным знаком, но .* внутри вашей группы захвата также необязательна.

Таким образом, у нас есть два возможных совпадения 4 и 4/, для которых preg_match возвращает 4 для группы захвата id и пустую строку для группы захвата title. Итак, как запрашиваемая обратная функция должна определять, должна ли она возвращать 4 или 4/ для двух групп захвата? Это невозможно сделать без дополнительной информации.

На самом деле, понимаете ли вы, что ваше регулярное выражение также соответствует / и пустой строке? Все в вашем регулярном выражении не является обязательным!

0 голосов
/ 10 марта 2010

Всё совпадение с регулярным выражением всегда находится в группе 0, поэтому вы можете получить это совпадение в массиве совпадений из preg_match(), обратившись к индексу 0 an / или используя $0 или \0 при замене preg_replace()

0 голосов
/ 10 марта 2010

Не уверен, что я понимаю вопрос, вы имеете в виду создание строки, как это?

$string = $id;
if ( isset($title) ) {
    $string .= "/$title";
}
0 голосов
/ 10 марта 2010

как получить исходную сопоставленную строку, если у нас уже есть идентификатор и заголовок?

Исходная сопоставленная строка должна быть в

$0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...