PHP’s PCRE требуется регулярное выражение быть обернуты в delimiters, которые отделяют образец от факультативного modifiers. В этом случае используется первый неалфавитно-цифровой символ (то есть '
), поэтому шаблон фактически равен (.*)<a (.*?)(.*) *href\=[
, а остальные рассматриваются как модификаторы. И это недопустимое регулярное выражение, так как [
не экранируется должным образом, а остальные не являются допустимыми модификаторами.
Как уже было предложено другими, вы можете исправить это, избегая любого вхождения разделителя '
внутри регулярного выражения или выберите другой разделитель, который не отображается в регулярном выражении.
Но кроме того, попытка проанализировать HTML с регулярными выражениями очень подвержена ошибкам. В вашем случае использование этого количества .*
также приведет к ужасному поведению производительности (это связано с тем, как обрабатываются регулярные выражения).
Лучше использовать правильный HTML-парсер, который возвращает DOM, которая может быть запрошена как PHP’s DOM library:
$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);
}
}
}
В качестве примечания: вам необходимо добавить `+` в качестве символа в классе символов :([-a-z0-9 _] +), потому что некоторые люди используют их для фильтрации триггеров в адресах электронной почты, например, [email protected] – Keng 2010-11-23 16:41:41
Все эти `. *` приведут к ужасному поведению производительности. – Gumbo 2010-11-23 16:41:44
примечание стороны: хотя редко, вполне приемлемо иметь адрес электронной почты, такой как: hell.o \ @ world @ two.ats.com Возможно, вам лучше снимать более простое регулярное выражение, если не будет электронные письма. Зависит от того, что вы делаете с ними. – DampeS8N 2010-11-23 16:43:34