Я пытаюсь понять, как захватить один оператор, если другой не существует с помощью preg_match.
Пример текста:
<!-- InstanceBeginEditable name="doctitle" -->
<title>BU Libraries | Research Guides | Citing Your Sources</title>
<!-- InstanceEndEditable -->
<div id="standardpgt"><h1><!-- InstanceBeginEditable name="pagetitle" --><strong>Citing Your Sources</strong><!-- InstanceEndEditable --></h1></div>
Поскольку существует список pagetitle, я хочу вытащить его вместо тега doctitle. Конечно, между ними есть много других персонажей, но я хотел показать вам небольшой образец.
Если pagetitle не существует, я хотел бы захватить содержимое doctitle.
Твист заключается в том, что я не использую PHP-код напрямую, я передаю инструкцию regex через конфигурационный файл, затем script берет его и вытаскивает 1-ю группу из инструкции.
Вот что я придумал:
((?!.*?<!--\s*?InstanceBeginEditable\s*?name=\x22pagetitle\x22\s*?-->.*?<!--\s*?InstanceEndEditable\s*?-->)<!--\s*?InstanceBeginEditable\s*?name=\x22doctitle\x22\s*?-->\s*?<title>(.*?)<\/title>\s*?<!--\s*?InstanceEndEditable\s*?-->|<!-- InstanceBeginEditable\s*?name=\x22pagetitle\x22\s*?-->(.*?)<!--\s*?InstanceEndEditable\s*?-->)
По какой-то причине php всегда читает первую пустую группу как группу 1, если она не работает.
Например, в приведенном выше примере текста он вернет
0 -> <!-- InstanceBeginEditable name="pagetitle" --><strong>Citing Your Sources</strong><!-- InstanceEndEditable -->
1 ->
2 -> <strong>Citing Your Sources</strong>
Я не могу понять, как это сделать. Я также написал это регулярное выражение:
(?(?=.*?<!--\s*?InstanceBeginEditable\s*?name=\x22pagetitle\x22\s*?-->.*?<!--\s*?InstanceEndEditable\s*?-->).*?<!-- InstanceBeginEditable\s*?name=\x22pagetitle\x22\s*?-->(.*?)<!--\s*?InstanceEndEditable\s*?-->|.*?<!--\s*?InstanceBeginEditable\s*?name=\x22doctitle\x22\s*?-->\s*?<title>(.*?)<\/title>\s*?<!--\s*?InstanceEndEditable\s*?-->)
Но это тоже не сработало. Большое спасибо за помощь.
Крис