PHP Regex для элементов списка и разрывов строк

1

Мне нужно 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

под https://regex101.com/.

Теги:

5 ответов

1
Лучший ответ

Вы можете попробовать с этим шаблоном:

/^- ([^:]*): (.*(?>\R.*)*?(?=\R- |\R*\z))/m

демонстрация

Ключ и значение записываются в группу 1 и группу 2. Группа 2 содержит нежирный квантификатор, который будет соответствовать до тех пор, пока не будет выполнено условие в lookahead. Lookahead (?=...) проверяет, следует ли за второй группой новая строка (\z \R) или конец строки (\z)

Чтобы получить конкретный элемент, замените ([^:]*) на то, что вы хотите.

  • 0
    Вау, отлично! Этот ответ работает для меня! Спасибо вам всем :)
  • 0
    @JonasZielke: обратите внимание, что если вы планируете запрашивать вашу строку несколько раз, может быть, лучше раз и навсегда получить все ключи / значения строки с помощью preg_match_all и создать ассоциативный массив.
1

Следующее должно работать:

^-\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 | Привет, спасибо за вашу помощь!

1

Вы можете использовать эту функцию поиска:

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!

Демо-версия

0

Ты не за горами.

Вместо того, чтобы точно соответствовать item one вы хотите сопоставить со словом или пространством, так что это будет [\w\s]*

Что-то по линии ^- [\w\s]*: (.*) Должно работать, хотя вы не упомянули, как эта информация поступает. Одна строка, вы пытаетесь выполнить поиск и замену? используя preg_match?

Проверьте эту ссылку, чтобы увидеть ее работу.

  • 0
    Это текстовый файл, и я хотел бы получить данные от пользователя (имя, адрес электронной почты и т. Д.).
  • 0
    Это похоже на файл yaml . Вы рассматривали возможность использования встроенного парсера yaml в php?
Показать ещё 1 комментарий
0

Используйте положительный lookbehind:

(?<=^- item one: ).*$

Если фраза (item one в приведенном выше примере) не является постоянной, вы можете использовать \K чтобы удалить все, что было согласовано до сих пор, для достижения положительного lookbehind с переменной длиной:

^- [^:]*: \K.*$

Ниже приведено небольшое чередование, позволяющее вам сопоставлять несколько строк. Не забудьте gm flags

^- [^:]*: \K(.|\n)*?(?=^-|$)

Смотрите это в действии

Ещё вопросы

Сообщество Overcoder
Наверх
Меню