Bekijk Volledige Versie : preg_match_all voor urls zonder quotes
Ik ben bezig met een scriptje dat alle hyperlinks van een pagina(source) stript, maar om dit te laten werken op alle beschikbare websites is nogal een klus.
Wat ik momenteel al werkende heb is dat alle href="linkpagina.php" gevonden worden, maar href=pagina.php nog niet. Probeer ik dit dan krijg ik zeer vaak dat de hele pagina gevonden wordt. Ik gebruik dan een pattern als: "/href=[\"]{0}(.*)[\"]{0}[\ ]{1}/i" . Dan krijg ik vaak terug:
found:
[0] ..
[1] pagina.php class="mooi"></td></tr></table> (spatie)(einde)
Iemand hier een goede oplossing voor?
/<\s*A\s*HREF="([^\"])+"\s*>([^>]*)<\/A>/i
Ga ik die even proberen TIMMiEJ! :)
Die werkt ook niet TIMMiEJ, die pakt alleen hyperlinks met quotes mee:
http://www.usd.edu/trio/tut/html/index.shtml
Array
(
[0] => Array
(
[0] => <a href="quiz.shtml">Quiz</a>
)
[1] => Array
(
[0] => l
)
[2] => Array
(
[0] => Quiz
)
)
Zet dan even ? na de quotes.
Wonko, dat geeft dit uit:
http://www.usd.edu/trio/tut/html/index.shtml
Array
(
[0] => Array
(
[0] => <a href=page.shtml>Basics</a>
<li><a href=header.shtml>Headings</a>
<li><a href=format.shtml>Formatting</a>
<li><a href=font.shtml>Font Tags</a>
<LI><a href=fontstyle.shtml>Font Styles</a>
<li><a href=hr.shtml>Lines</a>
<li><a href=links.shtml>Links</a>
<li><a href=lists.shtml>Lists</a>
<LI><a href=image.shtml>Images</a>
<li><a href=tables.shtml>Tables</a>
<li><a href=ssi.shtml>SSI</a>
<li><a href=frame/index.shtml>Frames</a>
<p><a href=terms.shtml>Glossary</a>
[1] => <a href="quiz.shtml">Quiz</a>
[2] => <a href=http://www.usd.edu/trio/>TRIO</a> | <a href=http://www.usd.edu/trio/tut/>Tutorials</a> |
<a href=mailto:bwjames@usd.edu>bwjames@usd.edu</a> | <a href=index.shtml>Back to
HTML 101</a>
)
[1] => Array
(
[0] => l
[1] => l
[2] => l
)
[2] => Array
(
[0] => Glossary
[1] => Quiz
[2] => Back to
HTML 101
)
)
En dit:
/<\s*A\s*HREF="?.+"?\s*>([^>]*)<\/A>/Ui
Try, untested, just from the head on to the screen so..
/* can also be used for preg_match_all */
$pattern = "#href\s*=\s*["]*([^"\s>]*)#";
preg_match($pattern, $link, $match);
/* or (returns array !)*/
$pattern = "/(<a href=\")(.+?)(\")(\s*)(>)(.+?)(<\/a>)/sie";
preg_match_all($pattern, $string, $matches);
/* another one */
$pattern = "#<a([^>]+)href=['"]{1}([^"]+)['"]{1}([^>]*)>#msi";
preg_match_all($pattern, $string, $matches);
PHP.NET READ AND LEARN (www.php.net/preg_match)
En dit:
/<\s*A\s*HREF="?.+"?\s*>([^>]*)<\/A>/Ui
Bedankt Wonko, deze werkt het beste. Ik heb na de match nog een strip/explode procedure toegevoegd om verschillende quotes te laten strippen mochten deze aanwezig zijn.
Jouw output ziet er zo uit:
[0] => Array (..)
[1] => Array
(
[0] => "/css/main.css" type="text/css" media="all
[1] => 'link.php' target='_blank'
[2] => blaat.php target=main
)
dat kan beter, en nu had ik tijd:
<?php
function extract_links($s){
$pattern = '|href="?([^"\s>]*)|i';
preg_match_all($pattern, $s, $matches);
return $matches[1];
}
$links = extract_links('<a href="http://www.openminds.be">openminds</a>' .
'<a href=http://www.openminds.be>openminds</a>' .
'<a href=http://www.openminds.be target="_blank">openminds</a>' .
'<a href="http://www.openminds.be" target="_blank">openminds</a>');
print_r($links);
?>
Uitvoer is:
Array
(
[0] => http://www.openminds.be
[1] => http://www.openminds.be
[2] => http://www.openminds.be
[3] => http://www.openminds.be
)