Поиск текста по шаблону исключая <a и <img

Статус
В этой теме нельзя размещать новые ответы.

saab

Постоялец
Регистрация
22 Янв 2010
Сообщения
74
Реакции
39
Здравствуйте, нет ли у кого регулярки на поиск определенного текста в html документе, при этом нужно исключить из результатов все совпадения, находящиеся внутри ссылок и изображений?
 
С регулярными выражениями такой вариант не пройдет. Я в таком случае перед поиском с помощью регулярок удаляю весь лишний текст, а уже потом ищу.
 
Уберите все линки и картинки регуляркой <a\s+[^>]*>.*<\/a>|<img\s+[^>]*>
А потом другой регуляркой ищите текст
 
Спасибо за ответы, но не совсем понимаю как потом вернуть обратно линки и картинки в текст, измененный 2-й регуляркой? Я пытаюсь сделать автоматическую перелинковку страниц и на выходе надо получить html, в котором ключевые слова будут заменены линками из массива (ключевик-ссылка)
 
Вот наваял такой скриптик
PHP:
<?php
$text = <<<'EOT'
key to hyt <a href="der/key"> key </a> frty <img src="path/key"/> <a href="der/key2"> other key </a>
as fsdf sadf <img src="path/key"/> as gasdrg arg key <a href="der3/key"> key </a> fsefwesf
EOT;
 
// Запоминаем все линки
$links_regexp = '/(<a\s+[^>]*>[^<]*<\/a>)/im';
preg_match_all($links_regexp, $text, $links);
 
// Запоминаем все картинки
$images_regexp = '/(<img\s+[^>]*>)/im';
preg_match_all($images_regexp, $text, $images);
 
// Меняем линки на плейсхолдер
$link_placeholder = '{link_placeholder}';
$no_links = preg_replace($links_regexp, $link_placeholder, $text);
 
// Меняем картинки на плейсхолдер
$img_placeholder = '{img_placeholder}';
$no_links_and_images = preg_replace($images_regexp, $img_placeholder, $no_links);
 
// Меняем key - на линку
$no_links_and_images = preg_replace('/key/im', '<a href="goto/hell">key</a>', $no_links_and_images);
 
$count = 1;
 
// Возвращаем на место линки
if (count($links[1]))
    foreach($links[1] as $link)
        $no_links_and_images = str_replace($link_placeholder, $link, $no_links_and_images, $count);
 
// Возвращаем на место картинки
if (count($images[1]))
    foreach($images[1] as $img)
        $no_links_and_images = str_replace($img_placeholder, $img, $no_links_and_images, $count);
 
echo $no_links_and_images;
?>

заменит все кроме того что в картинках и ссылках
 
  • Нравится
Реакции: saab
vhome, спасибо, принцип понял попробую применить.
P.S. Что еще кроме ссылок и картинок стоит вырезать в данном случае, iframe и BBcode вроде все?
 
P.S. Что еще кроме ссылок и картинок стоит вырезать в данном случае, iframe и BBcode вроде все?
Да вообще лучше любые теги убрать, так надежнее и практически ничего не стоит. Я бы модифицировал скрипт vhome следующим образом:

PHP:
<?php
$text = <<<'EOT'
key to hyt <a href="der/key"> key </a> frty <img src="path/key"/> <a href="der/key2"> other key </a>
as fsdf sadf <img src="path/key"/> as gasdrg arg key <a href="der3/key"> key </a> fsefwesf
EOT;
 
// Запоминаем всё лишнее
$regexp = '/(<a\s+[^>]*>[\W\w]*?<\/a>|<iframe[^>]*>[\W\w]*?<\/iframe>|<[^>]*>)/i';
preg_match_all($regexp, $text, $remember);
 
 
// Меняем линки на плейсхолдер
$placeholder = '{placeholder}';
$clear_text = preg_replace($regexp, $placeholder, $text);
 
// Меняем key - на линку
$clear_text = preg_replace('/key/im', '<a href="goto/hell">key</a>', $clear_text);
 
$count = 1;
 
// Возвращаем на место
if (count($remember[1]))
    foreach($remember[1] as $r)
        $clear_text = str_replace($placeholder, $r, $clear_text, $count);
 
echo $clear_text;
?>

Работоспособность не проверял, но смысл думаю понятен.
 
  • Нравится
Реакции: saab
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху