2013-06-22 10 views
3

мне нужно регулярное выражение для замены <, > и & с &lt;, &gt; и &amp; , но это символы Я хочу заменить только в <body></body> тегизаменить часть строки PHP

пример

Перед заменой

<head> <><><>& </head> <body><><>&</body> 

после замены

<head> <><><>& </head> <body>&lt;&gt;&lt;&gt;&amp;</body> 

спасибо :)

ответ

0

Я думаю, что вам действительно нужно:

  1. XML-парсер для разбора вашей строки и получить в разделе <body>. См. this question для получения дополнительной информации;
  2. htmlspecialchars() для получения результата.

Edit: Если вы точно знаете, что HTML выглядит, вы можете, конечно, также explode на </head> или <body> разделить ваш вклад в два, но это было бы в значительной степени зависит от конкретного формата входного поэтому я бы не рекомендовал его.

+0

мне нужно это, потому что у меня есть большой xml-файл с этим <, > и & in и simplexml_load_file() не могут прочитать файл теперь я загружаю файл с файлом, получающим контент, затем я хочу заменить preg_replace – php12345

+0

@ php12345 Возможно, что-то вроде XMLReader будет работать, см. вопрос, который я связал к. – jeroen

+0

@ php12345 См. Мое редактирование. – jeroen

0

Описание

Чтобы сделать это с помощью регулярных выражений ti'll должно быть сделано в течение нескольких шагов:

  1. Захват внутренней строки тела:

    регулярное выражение: (^.*?<body>)(.*)(<\/body>)$

    enter image description here

    Mat чес:

    [0] => <head> <><><>& </head> <body><><>&</body> 
    [1] => <head> <><><>& </head> <body> 
    [2] => <><>& 
    [3] => </body> 
    
  2. Заменить каждый тип символа отдельно внутри матчей [2]

  3. реконструируют Строка

PHP код примера

$sourcestring="<head> <><><>& </head> <body><><>&</body>"; 
preg_match('/(^.*?<body>)(.*)(<\/body>)$/ims',$sourcestring,$matches); 

$header=$Matches[1]; 
$body=$matches[2]; 
$footer=$Matches[3]; 

$body = preg_replace('/</ims','&lt;',$body); 
$body = preg_replace('/>/ims','&gt;',$body); 
$body = preg_replace('/&/ims','&amp;',$body); 

$output = $header . $body . $footer; 
0

Я сделал это с некоторым трюком. Во-первых, я нахожу текст между тегами тела, затем меняю его на html специальные символы и сохраняю.После этого я заменить текст между тегами с [TO_BE_REPLACED] и в конце концов изменить текст, который будет заменен текстом замаскирована htmlspecialchars()

<?php 
$str = '<head> <><><>& </head> <body><><>&</body>'; 
preg_match('/<body>(.*?)<\/body>/', $str, $match); 
$special = htmlspecialchars($match[1]); // you can use html entities as well 
$str = preg_replace('/<body>(.*?)<\/body>/','<body>[TO_BE_REPLACED]</body>',$str); 
echo htmlspecialchars(str_replace('[TO_BE_REPLACED]', $special, $str)); //this one is only to show purpose 
echo '<br>----<br>'; 
echo str_replace('[TO_BE_REPLACED]', $special, $str); 
?> 

Check demo

+0

Это также изменяет двойные и одинарные кавычки на их соответствующий символ, который не был включен в OP. –

+0

@Denomales он может использовать массив с str_replace, если htmlspecialchars() не нужен. Он не упомянул об этом ** ТОЛЬКО ** эти персонажи должны быть заменены. – Robert

+0

Правда, однако, он был очень явным, какие символы нужно было заменить. –