PHP’s PCRE erfordern den regulären Ausdruck in delimiters gewickelt werden, die das Muster von optionalen modifiers trennen. In diesem Fall wird das erste nicht-alphanumerische Zeichen verwendet (d. H. '
), so dass das Muster tatsächlich nur (.*)<a (.*?)(.*) *href\=[
ist und der Rest als Modifizierer behandelt wird. Und das ist ein ungültiger regulärer Ausdruck, da die [
nicht ordnungsgemäß maskiert ist und der Rest auch keine gültigen Modifikatoren sind.
Wie die anderen bereits vorgeschlagen haben, können Sie dies beheben, indem Sie jedes Vorkommen des Trennzeichens '
innerhalb des regulären Ausdrucks umgehen oder ein anderes Trennzeichen wählen, das nicht im regulären Ausdruck erscheint.
Aber abgesehen davon ist der Versuch, HTML mit regulären Ausdrücken zu analysieren, sehr fehleranfällig. In Ihrem Fall wird die Verwendung von vielen .*
auch zu einem schrecklichen Leistungsverhalten führen (es liegt nur daran, wie reguläre Ausdrücke verarbeitet werden).
besser verwenden, um einen richtigen HTML-Parser, der eine DOM zurückgibt, wie PHP’s DOM library abgefragt werden kann:
$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);
}
}
}
Als Randbemerkung: Sie hinzufügen müssen '+' als ein Zeichen in Ihrer Zeichenklasse :([-a-z0-9 _] +) weil einige Leute sie zum Filtern von Triggern in E-Mail-Adressen verwenden, zB [email protected] – Keng
All diese '. *' werden zu einem schrecklichen Leistungsverhalten führen. – Gumbo
Randnotiz: Obwohl selten, ist es durchaus akzeptabel, eine E - Mail - Adresse wie: hell.o \ @ world @ two.ats.com Sie können besser für eine einfachere Regex schießen, es sei denn, es gibt einige Sicherheitsbedenken mit der E-Mails. Hängt davon ab, was Sie mit em machen. – DampeS8N