2012-05-02 2 views
3

У меня возникла проблема с некоторым регулярным выражением, которое я сделал для моего проекта (помните, что я начинающий в регулярном выражении, который показан в следующем примере). У меня проблема с куском xml-кода, из которого я пытаюсь извлечь некоторые его части с помощью связанного шаблона.Необязательный шаблон регулярного выражения не дает значения

<banner piclink="pic" urlactive="url_active" urltarget="globaltgt" urllink="globallink" timevar="globaldelay" swf="0" smooth="1" name="name" alt="alternate" /> 

Я использую следующее регулярное выражение для получения piclink, urlactive, urltarget, urllink и timevar с помощью preg_match_all:

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>.*)\"/iU 

До сих пор так хорошо все работает, однако, сейчас я пытаюсь захват с ассоциацией имя и теги alt, которые являются необязательными, поскольку они не всегда появляются. Я попытался поставить их в скобки, а затем? чтобы показать, что они не являются обязательными, как, например:

(name=\"(?<name>.*)\")? 

Однако $ матчи [ «имя»] массив всегда пустой, я не знаю, где я Мессинг, но я пробовал все виды комбинаций и все они приводят к пустому результату, за исключением случаев, когда я помещаю (?: в конце и инкапсулирует все из swf = onward, тогда он возвращает, как 115 результатов в массиве, который не принимает, поскольку результат подобен $ matches ['name'] [X] = результат, где х иногда бывает 1 раз по сравнению с его значением по 109.

+0

Нужно ли вам использовать regex? Все ваши проблемы можно было бы решить очень легко, используя SimpleXML. –

+0

Нет XML-файла, код которого генерируется «на лету» внутри php. Я мог бы модифицировать много кода для хранения данных по мере его поступления, но прямо сейчас пощелка регулярного выражения занимает меньше времени, чем восстановление целого класса, чтобы удовлетворить эту потребность. Hmm on second думал, что я могу использовать simplexml со строкой, но мне интересно, если он принимает неверный код xml или ему нужен полный xml. –

+0

'SimpleXML' может работать как с строками, так и с файлами. –

ответ

1

Я согласен с тем, что что-то вроде SimpleXML было бы лучше, но если вы хотите испачкаться, вы можете использовать lookaheads, чтобы попытаться совпадение с остальные символы.

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU 
+0

Спасибо, я тоже попробую. –

+0

Не работает с ungreedy :(Элементы массива name и alt по-прежнему пусты. –

+0

Все, что я пытаюсь использовать в онлайн-инструменте regex, похоже, не фиксирует дополнительную группу, если она является необязательной и неровной –