PHP, инклюзивные результаты с preg_replace (RegEx) - PullRequest
0 голосов
/ 27 января 2020

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

У меня есть следующий RegEx:

/([a-zA-Z0-9]{1,})/([a-zA-Z0-9]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})\b

У меня есть файл, который состоит из следующих строк:

1: 

*/tdn/quota/plot_3/boot_tdd_8/Homes_Homes1/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*

2:

*/vdm/quota/plot_1/boot_tdd_1/Homes_Homes2/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*

3:

*/vdm/quota/plot_5/boot_tdd_3/Homes_Homes1/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*

Моя цель - сохранить все только после / Homes_Homes / part.

Я получаю правильную замену для первого путь к файлу с моим регулярным выражением:

*/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*

Второй путь к файлу также правильный:

*/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*

Однако для последнего пути к файлу я получаю:

*/container.rig* 

вместо

*/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*

Почему preg_replace не работает с третьим путем к файлу?

1 Ответ

1 голос
/ 27 января 2020

Причина, по которой вы получаете этот последний результат, заключается в том, что preg_replace заменит все совпадения, а в последнем примере строки шаблон совпадет дважды .

Что вы могли бы do устанавливает 4-й параметр $limit в 1 для выполнения одной замены.

Не все классы символов в вашем шаблоне соответствуют подчеркиванию, но если это будет нормально, вы можете сократить шаблон с помощью квантификатора {5} и якоря ^, чтобы подтвердить начало сортировки и использовать \ K для сопоставления, а затем забыть * в начале строки.

^\*\K(?:/\w+){5}

Regex demo | Php демо

Например

$re = '~^\*\K(?:/\w+){5}~';
$strings = [
    "*/tdn/quota/plot_3/boot_tdd_8/Homes_Homes1/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*",
    "*/vdm/quota/plot_1/boot_tdd_1/Homes_Homes2/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*",
    "*/vdm/quota/plot_5/boot_tdd_3/Homes_Homes1/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*"
];

foreach ($strings as $s) {
    echo preg_replace($re, '', $s) . PHP_EOL;
}

Выход

*/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*
*/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*
*/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...