Мне нужно Regex для поиска "item one" и получить "Amet Elit". Или "Название" и получите "Одно предложение с \na linebreak!"
- item one: Amet Elit
- Title: One sentence with
a line break!
- Desc: Hello and thank you for your help!
Поэтому регулярное выражение должно найти все после -
некоторые конкретные слова и :
И эта строка заканчивается перед разрывом строки со следующим -
.
Я попробовал это
/[^-\s'item one']:*(.*)/g
Вы можете попробовать с этим шаблоном:
/^- ([^:]*): (.*(?>\R.*)*?(?=\R- |\R*\z))/m
Ключ и значение записываются в группу 1 и группу 2. Группа 2 содержит нежирный квантификатор, который будет соответствовать до тех пор, пока не будет выполнено условие в lookahead. Lookahead (?=...)
проверяет, следует ли за второй группой новая строка (\z
\R
) или конец строки (\z
)
Чтобы получить конкретный элемент, замените ([^:]*)
на то, что вы хотите.
Следующее должно работать:
^-\h*([^:\R]*)\h*:\h*(.*$(?:\R[^-].*$)*)
Разбивается по частям:
^-\h*([^:\R]*)\h*
: соответствует словам между начальным дефисом (должно произойти при запуске линии) до двоеточия, обрезается (\h*
- горизонтальные пробелы вне захвата). В этой части не может быть разрывов строк (\R
)
\h*(.*)
: соответствует остальной части строки (с левой стороны).
(?:\R[^-].*$)*
: Не захватывающая ((?:
Группа, допускающая нуль или более строк, при условии, что они не начинаются с дефиса (\R[^-]
).
В PHP:
$input = "- item one: Amet Elit
- Title: One sentence with
a line break!
- Desc: Hello and thank you for your help!";
preg_match_all("#^-\s*([^:\R]*)\s*:\s*(.*(?:\R[^-].*$)*)#m",
$input, $matches);
foreach ($matches[1] as $i => $prefix) {
echo $prefix . " | " . $matches[2][$i] . "<br>";
}
Вывод:
первый пункт | Amet Elit
Название | Одно предложение с
разрыв строки!
Desc | Привет, спасибо за вашу помощь!
Вы можете использовать эту функцию поиска:
function srch($input, $key) {
preg_match('/(?<=\b' . preg_quote($key, '/') . ': ).*?(?=\n-|$)/s', $input, $m);
return $m[0];
}
Затем назовите его как:
$input = "- item one: Amet Elit
- Title: One sentence with
a line break!
- Desc: Hello and thank you for your help!";
php> echo srch($input, 'Title')
One sentence with
a line break!
php> echo srch($input, 'item one')
Amet Elit
php> echo srch($input, 'Desc')
Hello and thank you for your help!
Ты не за горами.
Вместо того, чтобы точно соответствовать item one
вы хотите сопоставить со словом или пространством, так что это будет [\w\s]*
Что-то по линии ^- [\w\s]*: (.*)
Должно работать, хотя вы не упомянули, как эта информация поступает. Одна строка, вы пытаетесь выполнить поиск и замену? используя preg_match
?
yaml
. Вы рассматривали возможность использования встроенного парсера yaml в php?
Используйте положительный lookbehind:
(?<=^- item one: ).*$
Если фраза (item one
в приведенном выше примере) не является постоянной, вы можете использовать \K
чтобы удалить все, что было согласовано до сих пор, для достижения положительного lookbehind с переменной длиной:
^- [^:]*: \K.*$
Ниже приведено небольшое чередование, позволяющее вам сопоставлять несколько строк. Не забудьте gm
flags
^- [^:]*: \K(.|\n)*?(?=^-|$)
preg_match_all
и создать ассоциативный массив.