2013-08-29 2 views
1

у меня есть HTML-страницуRegex заменить URL в HTML-страницу

<tr> 
<td rowspan="7"> 
<a href="http://www.link1.com/" style="text-decoration: none;"> 
     <img src="image1.jpg" width="34" height="873" alt="" style="display:block;border:none" /> 
     </a> 
    </td> 
    <td colspan="2" rowspan="2"> 
     <a href='http://www.link1.com/test.php?c=1'> 
     <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" /> 
     </a> 
    </td> 
<td colspan="2" rowspan="2"> 
     <a href='http://www.url.com/test.php?c=1'> 
     <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" /> 
     </a> 
    </td> 

Я хочу, чтобы заменить все URL в HREF на mytest.com?url=$link

Я стараюсь с:

$messaget = preg_replace('/<a(.*)href="([^"]*)"(.*)>/','mytest.com?url=$2',$messaget); 
+2

PHP - это код на стороне сервера ... поэтому я не уверен, что/как вы пытаетесь выполнить свой результат. – adamdehaven

+0

Извините ... Мой html-код находится в переменной $ messaget. – Yobogs

+1

Вы никогда не должны использовать регулярное выражение для работы с HTML-кодом, вместо этого используйте парсер HTML. См. Http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php и http://simplehtmldom.sourceforge.net/. – Technoh

ответ

1

Это может помочь вам в краткосрочной перспективе:

preg_replace('/<a (.*)href=[\'"]([^"]*)[\'"](.*)>/', '<a $1href="mytest.com?url=$2"$3>', $messaget); 

В вашем регулярном выражении вы использовали href="...", т. Е. Двойные кавычки, но в вашем HTML у вас есть смесь двух и одинарных кавычек.

И в заменяемой строке вы забыли указать $1 и $3.

0 сказано, НЕ используйте регулярное выражение для анализа HTML. Ответ на @BenLanc ниже лучше, используйте это вместо этого. Прочитайте link, который он опубликовал.

+0

Его регулярное выражение работает только для двойных кавычек, проблема заключается в том, что ему нужно учитывать как двойные, так и одиночные по его предоставленному образцу. Таким образом, регулярное выражение, которое вы предоставили, не будет выполнять эту работу. Хотя вы исправили ошибку замены – Kieran

+0

Вы правы. Я не видел раньше, что у него также были двойные кавычки, я видел только одинарные кавычки. Спасибо, исправит сейчас. – janos

+0

@janos Это круто, unid downvote и удалил мой комментарий, когда вы обновили свой ответ – BenLanc

0

Не забудьте/м в конце вашего регулярного выражения, так как ваш используется многострочный источник:

PHP Doc PCRE

1

Don't use regex on HTML, HTML is not regular.

Предполагая, что ваша разметка действительна (и если это не так, сначала пройдите через Tidy), вы должны использовать xpath, чтобы захватить элементы, а затем обновить href напрямую. Например:

<?php 
$messaget = <<<XML 
<tr> 
    <td rowspan="7"> 
    <a href="http://www.link1.com/" style="text-decoration: none;"> 
     <img src="image1.jpg" width="34" height="873" alt="" style="display:block;border:none" /> 
    </a> 
    </td> 
    <td colspan="2" rowspan="2"> 
     <a href='http://www.link1.com/test.php?c=1'> 
     <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" /> 
     </a> 
    </td> 
    <td colspan="2" rowspan="2"> 
     <a href='http://www.url.com/test.php?c=1'> 
     <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" /> 
     </a> 
    </td> 
</tr> 
XML; 

$xml = new SimpleXMLElement($messaget); 

// Select all "a" tags with href attributes 
$links = $xml->xpath("//a[@href]"); 

// Loop through the links and update the href, don't forget to url encode the original! 
foreach($links as $link) 
{ 
    $link["href"] = sprintf("mytest.com/?url=%s", urlencode($link['href'])); 
} 

// Return your HTML with transformed hrefs! 
$messaget = $xml->asXml(); 
Смежные вопросы