Замена изображения SRC в тегах HTML? - PullRequest
0 голосов
/ 13 сентября 2009

Я хочу использовать регулярные выражения для замены src html-атрибутов. HTML не деформирован и, к счастью, принимает одинаковую форму на всех страницах базы данных - т.е.

<img src="http://x.y/z/1.png" />

У меня есть код, который отлично работает, если на странице только одно изображение. Я хочу знать, как лучше заменить несколько изображений, так как это заменит все теги изображений на одну строку.

$result = $s->db_query("SELECT reviewFullText as f FROM reviews WHERE reviewsID = 155");
while($row = mysql_fetch_array($result))
{
    $body = stripslashes(html_entity_decode($row['f'], ENT_NOQUOTES, "UTF-8"));
    preg_match_all('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', $body, $matches);
    for($i=0;$i<count($matches[0]);$i++)
    {
        $number = preg_replace("/[^0-9]/", '', $matches[0][$i]);
        echo preg_replace('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', '<img src="http://x.y/a/' . $number . '.png"', $matches[0][$i]);
    }
}

Таким образом, если страница содержит два файла, один с именем 1.png и другой с именем 2.png, сценарий должен проанализировать числа и заменить их другим URL-адресом, таким как http://x.y/a/1.png и http://x.y/a/2.png.

Я слышал, preg_replace_callback - лучший способ сделать это, но я понятия не имею, как заставить это работать ... Помогите!

Ответы [ 2 ]

14 голосов
/ 13 сентября 2009

Не используйте регулярные выражения для нерегулярных языков, таких как HTML . Вместо этого используйте парсер . Это сэкономит вам много времени и усилий.

# Untested code:
$xml = new SimpleXml($xmlString);
foreach ($xml->xpath('//img') as $imgNode) {
    $imgNode->addAttribute('src', "http://x.y/a/" . $imgNode->getAttribute('src'));
}
echo $xml->asXML();

Обратите внимание, что вам понадобится что-то вроде DOMDocument::loadHtml(), если ваш html не является xhtml (т.е. действительным xml), но идея остается прежней.

1 голос
/ 13 сентября 2009

Добавьте глобальный флаг замены "g" в вашем регулярном выражении.

* * Тысяча два '/ your_regex / г г * * 1005

Как предположил soulmerge, поскольку ваш html не является деформированным (я предполагаю, что вы имеете в виду правильно сформированный XML), XSLT-преобразование также будет эффективным способом изменить что-либо в вашем документе. Вы можете сопоставить атрибут @src и изменить его в соответствии с вашими требованиями.

Вы также можете сопоставить любые другие теги / атрибуты, если вам нужно изменить некоторые другие части документа одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...