Поскольку здесь важен номер строки, а не фактическое содержимое div, я был бы склонен вообще не использовать регулярные выражения. Я, вероятно, explode()
строка в массив и перебрать этот массив в поисках вашего маркера. Вот так:
<?php
$myContent = "[your string of html here]";
$myArray = explode("\n", $myContent);
$arraylen = count($myArray); // So you don't waste time counting the array at every loop
$lineNo = 0;
for($i = 0; $i < $arraylen; $i++)
{
$pos = strpos($myArray[$i], 'id="Alpha"');
if($pos !== false)
{
$lineNo = $i+1;
break;
}
}
?>
Отказ от ответственности: у меня нет готовой установки php для тестирования, поэтому может потребоваться некоторая отладка.
Надеюсь, это поможет, так как я думаю, что вы, вероятно, просто потратите время на внедрение механизма синтаксического анализа, просто чтобы сделать что-то настолько простое - особенно если это одноразовое действие.
Редактировать: если контент важен для вас и на этом этапе, то вы можете использовать его в сочетании с другими ответами, которые обеспечивают адекватное выражение для работы.
Редактировать # 2: Ой, эй ... вот мои два цента:
"/<div.*?id=\"Alpha\".*?>.*?(<div.*//div>)*.*?//div>/m"
(<div.*//div>)
сообщает механизму регулярных выражений, что он может найти вложенные теги div и просто включить их в совпадение, если найдет их, а не просто остановиться на первом </div>
. Однако это решает проблему только при наличии только одного уровня вложенности. Если есть еще, то регулярное выражение не для вас извините: (.
/m
также заставляет механизм регулярных выражений игнорировать разрывы строк, поэтому вам не нужно портить выражения с помощью [\S\s]
везде.
Опять же, извините, у меня нет среды для тестирования в данный момент, поэтому вам может понадобиться отладка.
Приветствие
Иэн