Frage

Ich brauche die E-Mail-Adresse von einem Anker bekommen mit einem mailto Attribute mit regex.

Dieses Muster: (.*)<a\s(.*?)(.*)\s*href\=['"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['"]>(.*)</a>(.*)

Arbeiten in regex Trainer obwohl es funktioniert nicht mit PHP.

Code:

preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);

print_r($matches);

Warum Doenst es in PHP arbeiten?

War es hilfreich?

Lösung

PHP PCRE den regulären Ausdruck erfordern in Trennzeichen , die das Muster von optional Modifikatoren . In diesem Fall werden die ersten nicht-alphanumerischen Zeichen verwendet (d.h. ') so das Muster tatsächlich nur (.*)<a (.*?)(.*) *href\=[ und der Rest als Modifizierer behandelt. Und das ist ein ungültiger regulärer Ausdruck als die [ nicht richtig übersetzt ist und der Rest sind nicht gültig Modifikatoren auch nicht.

Wie die andere haben bereits vorgeschlagen, Sie können dieses Problem beheben, indem jedes Auftreten des Begrenzungs ' innerhalb des regulären Ausdrucks zu entkommen oder eine andere Trennzeichen wählen, die nicht im regulären Ausdruck erscheinen.

Aber davon abgesehen, versuchen zu Parse HTML mit regulären Ausdrücken ist sehr fehleranfällig. In Ihrem Fall, dass viele .* mit auch in einem schrecklichen Leistungsverhalten führen werden (es ist nur darauf zurückzuführen, wie reguläre Ausdrücke verarbeitet werden).

verwenden besser einen richtigen HTML-Parser, dass ein DOM-Renditen, die wie PHP DOM Bibliothek :

$doc = new DomDocument();
$doc->loadHTML($str);
foreach ($doc->getElementsByTagName("a") as $a) {
    if ($a->hasAttribute("href")) {
        $href = trim($a->getAttribute("href"));
        if (strtolower(substr($href, 0, 7)) === 'mailto:') {
            $components = parse_url($href);
        }
    }
}

Andere Tipps

Ihr Trennzeichen ist ein Zitat ', und es gibt einige Beispiele davon in der Regex:

preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);
                                      ^                                              ^

Escape sie (d.h .: \') oder Ihr Trennzeichen ändern.

if (preg_match('#<a\s.*?href=[\'"]mailto:([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})[\'"].*?>.*?</a>#i', $subject, $regs)) {
    $result = $regs[0];
} else {
    $result = "";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top