PDA

Bekijk Volledige Versie : preg_match_all voor urls zonder quotes



WH-Tim
16/05/07, 12:55
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?

TiMMiEJ
16/05/07, 13:10
/<\s*A\s*HREF="([^\"])+"\s*>([^>]*)<\/A>/i

WH-Tim
16/05/07, 14:11
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
)

)

wonko
16/05/07, 17:28
Zet dan even ? na de quotes.

WH-Tim
16/05/07, 17:39
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
)

)

wonko
16/05/07, 17:59
En dit:

/<\s*A\s*HREF="?.+"?\s*>([^>]*)<\/A>/Ui

ol4pro
16/05/07, 23:18
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)

WH-Tim
17/05/07, 15:41
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
)

wonko
17/05/07, 17:21
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
)