У меня есть текст, например, такой:
$text="<body><div><p>Some test text.</p></div><p>Some test text.</p></body>";
И у меня есть массив регулярных выражений:
$regexes = array(
0 => '/<div>.*<\/div>/',
1 => '/<p>.*<\/p>/')
;
Мне нужно применять каждое регулярное выражение поочередно к исходному тексту и при некоторых заменах в найденных блоках.
Например:
$result = $text;
foreach ($regexes as $reg) {
preg_match($reg, $result, $matches);
$result = $matches[0];
}
вернуть "<p>Some test text.</p>"
Как заменить слово «текст» словом «новый», но только в первой части $ text?
Элементы (регулярные выражения) массива $ regexes могут быть в любом количестве и порядке.
Результат должен быть таким: "<body><div><p>Some new text.</p></div><p>Some test text.</p></body>"
Лучше всего было бы разделить ваши разделы; Я предполагаю, что этот пример будет применен к большему блоку, и, к сожалению, трудно быть универсальным в алгоритмах замены — каждый формат будет иметь шанс, как вы лучше его разрабатываете.
В этом случае я предполагаю, что вы разделяете на основе <div>
элементы. Итак, мы могли бы сделать:
$elements = explode('</div>',$text);
// in this case your required block is at position [0]
$elements[0]=apply_regex_algorithm($elements[0]);
$text = implode('</div>',$elements);
Как уже упоминалось выше, способ разделения будет зависеть от того, как ваш текст вводится в метод и каковы ваши конкретные требования к замене.
Для более конкретного редактирования текста в элементах набора (то есть в более крупной структуре HTML) проверьте Symfony2 DOM Crawler.
Других решений пока нет …