preg_match_all как убрать тег img? - PullRequest
0 голосов
/ 21 июня 2011
$str=<<<EOT
<img src="./img/upload_20571053.jpg" /><span>some word</span><div>some comtent</div>
EOT;

Как удалить тег img с помощью preg_match_all или другим способом?Спасибо.

Я хочу, чтобы echo <span>some word</span><div>some comtent</div> // мог быть другим html-тегом, как в $str, просто удалите img.

Ответы [ 7 ]

2 голосов
/ 21 июня 2011

Как говорили многие люди, вы не должны делать это с регулярным выражением. Большинство примеров, которые вы видели для замены тегов изображений, наивны и не будут работать в любой ситуации. Регулярное выражение, учитывающее все (при условии, что у вас в первую очередь правильно сформированный XHTML), будет очень длинным, очень сложным и очень трудным для понимания или редактирования позже. И даже если вы думаете, что это работает правильно, скорее всего, это не так. Вы действительно должны использовать парсер, созданный специально для парсинга (X) HTML.

Вот как это сделать правильно без регулярного выражения с использованием расширения DOM PHP:

// add a root node to the XHTML and load it
$doc = new DOMDocument;
$doc->loadXML('<root>'.$str.'</root>');
// create a xpath query to find and delete all img elements
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//img') as $node) {
        $node->parentNode->removeChild($node);
}
// save the result
$str = $doc->saveXML($doc->documentElement);
// remove the root node
$str = substr($str, strlen('<root>'), -strlen('</root>'));
1 голос
/ 21 июня 2011

В дополнение к @ Karo96, я бы пошел более широко:

/<img[^>]*>/i

И:

$re = '/<img[^>]*>/i';
$str = preg_replace($re,'',$str);

демо

Это также предполагает, что HTML будет правильно отформатирован.Кроме того, это игнорирует общее правило, согласно которому мы должны не анализировать html с регулярным выражением, но ради того, чтобы ответить вам, я включаю его.

1 голос
/ 21 июня 2011
$str = preg_replace('#<img[^>]*>#i', '', $str);
1 голос
/ 21 июня 2011
preg_replace("#\<img src\=\"(.+)\"(.+)\/\>#iU", NULL, $str);
echo $str;

0 голосов
/ 21 июня 2011
$noimg = preg_replace('/<img[^>]*>/','',$str);

Должен сделать свое дело.

0 голосов
/ 21 июня 2011

Не используйте регулярные выражения для этого. период. Это не совсем синтаксический анализ, и это может быть тривиально, но рексеги не предназначены для DOM:

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Просто используйте DomDocument, например.

0 голосов
/ 21 июня 2011

Возможно, вы хотите preg_replace. Тогда это будет: $str = preg_replace('#<img.+?>#is', '', $str), хотя следует отметить, что для любой нетривиальной обработки HTML вы должны использовать синтаксический анализатор XML, например, используя DOMDocument

...