Вырезание URL из текста и кривых HTML-файлов
Иногда нужно вырезать из HTML-текст ссылки на URL или Email. Если у вас в HTML нет заведомо кривого кода, то это очень простая задача на регулярное выражение типа
<a[^>]+href=([^ >]+)[^>]*>(.*?)</a>
Но ссылки бывают разные... Как делать вашу программу, решать вам. Можно брать только 100% верные ссылки, но тогда некоторые кривые сслыки не попадут (хотя они тоже верные). Можно брать все подряд, но тогда кое-какие ссылки будут не совсем корректно вырезаться.
Текст программы:
<?
$str="
<a href=url1>name1</a>
<a href=url2>name2</a>
<a href='url3'>name3</a>
<a href=url4>< скобки ></a>
<a href="url5"><b>жирно</b></a>
<a href=url6>"кавычки"</a>
<a target="<попытка обхитрить программу> хахаха" href=url7>77777</a>
<a href=url8 target="<попытка обхитрить программу> хахаха" >88888</a>";
echo "<pre>Исходный код:".htmlspecialchars($str)."</pre>";
echo "---------------Вариант 1---------------";
preg_match_all("!<a.*?href="?'?([^ "'>]+)"?'?.*?>(.*?)</a>!is",$str,$ok);
for ($i=0; $i<count($ok[1]); $i++) {
echo "<li>".$ok[1][$i]." - ".$ok[2][$i];
}
echo "<br>---------------Вариант 2---------------";
preg_match_all("!<a[^>]+href="?'?([^ "'>]+)"?'?[^>]*>(.*?)</a>!is",$str,$
ok);
for ($i=0; $i<count($ok[1]); $i++) {
echo "<li>".$ok[1][$i]." - ".$ok[2][$i];
}
echo "<br>---------------Вариант 3---------------";
preg_match_all("!<a[^>]+href="?'?([^ "'>]+)"?'?[^>]*>([^<>]*?)</a>!is",$s
tr,$ok);
for ($i=0; $i<count($ok[1]); $i++) {
echo "<li>".$ok[1][$i]." - ".$ok[2][$i];
}
?>
Результат исполнения примера:
Исходный код:
<a href=url1>name1</a>
<a href=url2>name2</a>
<a href='url3'>name3</a>
<a href=url4>< скобки ></a>
<a href="url5"><b>жирно</b></a>
<a href=url6>"кавычки"</a>
<a target="<попытка обхитрить программу> хахаха" href=url7>77777</a>
<a href=url8 target="<попытка обхитрить программу> хахаха" >88888</a>
---------------Вариант 1---------------
url1 - name1
url2 - name2
url3 - name3
url4 - < скобки >
url5 - жирно
url6 - "кавычки"
url7 - 77777
url8 - хахаха" >88888
---------------Вариант 2---------------
url1 - name1
url2 - name2
url3 - name3
url4 - < скобки >
url5 - жирно
url6 - "кавычки"
url8 - хахаха" >88888
---------------Вариант 3---------------
url1 - name1
url2 - name2
url3 - name3
url6 - "кавычки"
Комментарии:
Нету комментариев для вывода...