совершенно новый для регулярных выражений я пытаюсь оптимизировать один или, по крайней мере, знаю, есть ли лучшие способы сделать это.
Вот моя строка ввода:
$str = 'Some text
spanned on
several lines
txt_to_grab1 fixed_text1 txt_to_grab2
Full line to grab
txt_to_grab3 fixed_text2 txt_to_grab4
Some text after';
Iя пытаюсь перехватить строки от «txt_to_grab1» до «txt_to_grab4», но только слова «txt_to_grabX» и строку «Full line to grab».
Я хочу сохранить все нетронутым до и после (то есть разрывы строк), но удалите разрывы строк внутри строк, которые я беру (так как каждая строка будет <tr>
, которая войдет в HTML-таблицу).
Шаблоны регулярных выражений / замените найденное соответствие:
$find = "#(?<=\n)(.*?) fixed_text1 (.*?)(\n.*?\n)(.*?) fixed_text2 (.*?)(\n)#i";
$replace = '"$1" && "$2" grabbed.$3"$4" && "$5" grabbed.$6';
$find = "#(.*)(?<=\n)(.*?) fixed_text1 (.*?)(\n)(.*)(?<=\n)(.*?) fixed_text2 (.*?)(\n.*)#is";
$replace = '$1"$2" && "$3" grabbed.$4$5"$6" && "$7" grabbed.$8';
Вопросы:
Все вопросы можно суммировать следующим образом: существуют ли лучшие / короткие / быстрые шаблоны?
как заставить шаблоны работать с любой из \ r\ n или \ n?Я читал где-то в стеке, что (\ r? \ N) было бы решением, но я не знаю, как их использовать в виде сзади.Например, следующие шаблоны работают, но они мне не нравятся (грязные, так как в видоискателях используются только \ n, могут привести к неожиданным результатам):
"#(?<=\n)(.*?) fixed_text1 (.*?)(\r?\n.*?\r?\n)(.*?) fixed_text2 (.*?)(\r?\n)#i"
"#(.*)(?<=\n)(.*?) fixed_text1 (.*?)(\r?\n)(.*)(?<=\n)(.*?) fixed_text2 (.*?)(\r?\n.*)#is";
еще лучше, какиспользовать модификатор "s", чтобы удалить все разрывы строк из шаблона, чтобы иметь возможность использовать (. *?), но все еще захватывать то, что я хочу?Границы слова?
полезен / полезен многострочный режим (модификатор m)?
Мне бы очень хотелось, чтобы регулярные выражения были объяснены, если вы предоставите некоторые:)