Задать вопрос
@Snewer

Как написать регулярное выражение?

Здравствуйте!

Имеется строка вида:
123 абв 123 абв абв 123 абв


Как регулярным выражением вытащить слова ("абв"), и, если слева и/или справа есть числа, то и их тоже.

То есть из указанной строки нужно получить массив:
[
       [123, абв, 123],
       [123, абв, null], 
       [null, абв, 123],
       [123, абв, null],
]
  • Вопрос задан
  • 202 просмотра
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
По рв я не спец, но когда приходится их писать, то это помогает
www.phpliveregex.com
Ответ написан
Комментировать
(?(?=((?<=\d\s))*)(\d+\s)*)(абв)(?=(\s\d+)*)
Результат
Данная регулярка работает только в PCRE (PHP)

p.s.
<?php
function str_replace_once($search, $replace, $text){
    $pos = strpos($text, $search);
    return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}
$st = '123 абв 123 абв абв 123 абв';
$pattern = '~(?(?=((?<=\d\s))*)(\d+\s)*)(абв)(?=(\s\d+)*)~ium';
$flag = true;
$res = [];
do{
    if (preg_match($pattern,$st, $search)){
        $do = !empty($search[2])?$search[2]:null;
        $po = !empty($search[4])?$search[4]:null;
        $st = str_replace_once($search[3] , '', $st);
        $res[]= [$do , $search[3], $po];

    }else {
        $flag = false;
    }
}while($flag);
var_dump($res);
/*
array(4) {
  [0]=>
  array(3) {
    [0]=>
    string(4) "123 "
    [1]=>
    string(6) "абв"
    [2]=>
    string(4) " 123"
  }
  [1]=>
  array(3) {
    [0]=>
    string(4) "123 "
    [1]=>
    string(6) "абв"
    [2]=>
    NULL
  }
  [2]=>
  array(3) {
    [0]=>
    NULL
    [1]=>
    string(6) "абв"
    [2]=>
    string(4) " 123"
  }
  [3]=>
  array(3) {
    [0]=>
    string(4) "123 "
    [1]=>
    string(6) "абв"
    [2]=>
    NULL
  }
}

*/


оказалась что preg_match_all не поддерживает данный стандарт... пришлось сделать такой велосипед... Очень интересно как сделать глобал поиск по строке с регуляркой которая смотрит вперед и назад.
БУДУ НАДЕЯТЬСЯ ЧТО КТО-НИБУДЬ ТУТ ОТПИШЕТ!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы