Соответствие регулярному выражению PHP (URL)

I'm looking for a regex to match a given url wich contains something like
"/unknownnumber/knownstring1-unknownstring.html"
in order to redirect it with PHP to other new url like
"/unknownnumber/knownstring2-unknownstring"
to keep Google indexed urls active.

I have used next statement, but $do_match returns 0, so I'm doing something wrong...
Could someone help me with my regular expression?

$myURL = "/unknownnumber/knownstring1-unknownstring.html";
$do_match = preg_match('~"([0-9]+)/knownstring1-(.*?)$.html"~', $myURL, $matches);
0
Итак, echo '
'; print_r ($ matches); echo '
'; exit; пуст?
добавлено автор Alex Sawallich, источник
Да, он возвращает пустой массив, а $ do_match возвращает 0
добавлено автор jprog, источник
Да, он возвращает пустой массив, а $ do_match возвращает 0
добавлено автор jprog, источник

7 ответы

Dot (.), Тире (-) являются метасимволами, которые имеют особое значение.

Если «unknownumber» является числовой частью вашей строки, то шаблон regexp будет выглядеть так:

$do_match = preg_match('/\/(\d+)\/knownstring1\-([^\.]+)\.html/', $input, $matches);
2
добавлено
Извините, был в спешке. Я исправил шаблон. В нем отсутствовал предыдущий разделитель - косая черта в конкретном случае. Однако, поскольку вы используете тильды в качестве разделителя, принятый шаблон будет выглядеть следующим образом: $ do_match = preg_match ('~ \/(\ d +) \/knownstring1 \ - ([^ \.] +) \. html ~ ', $ input, $ matches);
добавлено автор Aleksandr Makov, источник
У меня есть совместное оба ответа (так как вы дали мне следующее сообщение: Warning: preg_match() [function.preg-match]: разделитель не должен быть буквенно-цифровым или обратным слэшем), поэтому я использовал «$ do_match = preg_match ('~" \/(\ d +) \/knownstring1 \ - ([^ \.] +) \. html/"$ ~ ', $ myURL, $ matches);" но ... он все равно не возвращает ни одного матча ... извините ..
добавлено автор jprog, источник

Dot (.), Тире (-) являются метасимволами, которые имеют особое значение.

Если «unknownumber» является числовой частью вашей строки, то шаблон regexp будет выглядеть так:

$do_match = preg_match('/\/(\d+)\/knownstring1\-([^\.]+)\.html/', $input, $matches);
2
добавлено
Извините, был в спешке. Я исправил шаблон. В нем отсутствовал предыдущий разделитель - косая черта в конкретном случае. Однако, поскольку вы используете тильды в качестве разделителя, принятый шаблон будет выглядеть следующим образом: $ do_match = preg_match ('~ \/(\ d +) \/knownstring1 \ - ([^ \.] +) \. html ~ ', $ input, $ matches);
добавлено автор Aleksandr Makov, источник
У меня есть совместное оба ответа (так как вы дали мне следующее сообщение: Warning: preg_match() [function.preg-match]: разделитель не должен быть буквенно-цифровым или обратным слэшем), поэтому я использовал «$ do_match = preg_match ('~" \/(\ d +) \/knownstring1 \ - ([^ \.] +) \. html/"$ ~ ', $ myURL, $ matches);" но ... он все равно не возвращает ни одного матча ... извините ..
добавлено автор jprog, источник

A $ - это маркер конца строки. Вам нужно поместить его в конец регулярного выражения, а также означать буквенный . вам нужно его избежать.

preg_match('~"([0-9]+)/knownstring1-(.*?)\.html"$~'....
2
добавлено
Спасибо за этот совет, но он по-прежнему не возвращает никаких совпадений ... Я видел, может быть, мое регулярное выражение должно быть как $ do_match = preg_match ('~ "/ ([0-9] +)/knownstring1 - (. * ?) $. html "~ ', $ myURL, $ matches); с дополнительной косой чертой перед номером, но он по-прежнему не работает ...
добавлено автор jprog, источник

A $ - это маркер конца строки. Вам нужно поместить его в конец регулярного выражения, а также означать буквенный . вам нужно его избежать.

preg_match('~"([0-9]+)/knownstring1-(.*?)\.html"$~'....
2
добавлено
Спасибо за этот совет, но он по-прежнему не возвращает никаких совпадений ... Я видел, может быть, мое регулярное выражение должно быть как $ do_match = preg_match ('~ "/ ([0-9] +)/knownstring1 - (. * ?) $. html "~ ', $ myURL, $ matches); с дополнительной косой чертой перед номером, но он по-прежнему не работает ...
добавлено автор jprog, источник
$myURL = "/unknownnumber/knownstring1-unknownstring.html";
if(preg_match('#"/(\d+)/knownstring1-(.*)\.html"#', $myURL, $matches))
    var_dump($matches);

выходы:

php > $exp = '#"/(\d+)/knownstring1-(.*)\.html"#';
php > $str = '"/23421/knownstring1-unknownstring.html"';
php > if(preg_match($exp, $str, $matches)) var_dump($matches); else echo 'nope' .     PHP_EOL;
array(3) {
  [0]=>
  string(40) ""/23421/knownstring1-unknownstring.html""
  [1]=>
  string(5) "23421"
  [2]=>
  string(13) "unknownstring"
}
php > 
1
добавлено
Нет проблем с росой.
добавлено автор David Harris, источник
Спасибо! Это регулярное выражение, которое я искал!
добавлено автор jprog, источник
$myURL = "/unknownnumber/knownstring1-unknownstring.html";
if(preg_match('#"/(\d+)/knownstring1-(.*)\.html"#', $myURL, $matches))
    var_dump($matches);

выходы:

php > $exp = '#"/(\d+)/knownstring1-(.*)\.html"#';
php > $str = '"/23421/knownstring1-unknownstring.html"';
php > if(preg_match($exp, $str, $matches)) var_dump($matches); else echo 'nope' .     PHP_EOL;
array(3) {
  [0]=>
  string(40) ""/23421/knownstring1-unknownstring.html""
  [1]=>
  string(5) "23421"
  [2]=>
  string(13) "unknownstring"
}
php > 
1
добавлено
Нет проблем с росой.
добавлено автор David Harris, источник
Спасибо! Это регулярное выражение, которое я искал!
добавлено автор jprog, источник

Попробуйте:

$myURL = "/123/knownstring1-unknownstring.html";
$do_matches = preg_match('#\/(\d+)\/(.*)\-(.*)\.html#', $myURL, $matches);
print_r($matches);

вывод print_r:

Array
(
    [0] => /123/knownstring1-unknownstring.html
    [1] => 123
    [2] => knownstring1
    [3] => unknownstring
)
0
добавлено
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp