PHP PCRE требует, чтобы регулярное выражение было обернуто в разделители , которые отделяют шаблон от необязательных модификаторов . В этом случае используется первый не буквенно-цифровой символ (т. Е. '
), поэтому шаблон на самом деле просто (.*)<a (.*?)(.*) *href\=[
, а остальные обрабатываются как модификаторы. И это недопустимое регулярное выражение, поскольку [
не экранировано должным образом, а остальные тоже не являются допустимыми модификаторами.
Как уже предлагали другие, вы можете исправить это, избегая любого вхождения разделителя '
внутри регулярного выражения или выбирая другой разделитель, который не появляется в регулярном выражении.
Но, кроме того, попытка анализа HTML с помощью регулярных выражений очень подвержена ошибкам. В вашем случае использование такого количества .*
также приведет к ужасному поведению производительности (это просто из-за того, как обрабатываются регулярные выражения).
Лучше использовать правильный анализатор HTML, который возвращает DOM, к которому можно обращаться, например, Библиотека DOM PHP :
$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);
}
}
}