2014-10-31 3 views
0

Я пытаюсь получить некоторые данные из Amazon, и я использую preg_match, чтобы найти нужные мне элементы. Однако у меня проблемы.Regex "|" Проблемы

Я совмещаю два утверждения, поэтому, если он не находит его, он ищет другого. Я считаю, что если продукт не указан, одна из этих вещей всегда будет существовать.

Так что его работа ищет стоимость доставки. Если его нет, он ищет текст «FREE Shipping».

preg_match_all('/(& <b>(.*?)<|<span class="olpShippingPrice">(.*?)<)/',$results,$match1); 

Если я запускаю это я получаю данные, которые я хочу, но это захватывая некоторые HTML, которые не были бы захваченный, если я побежал это в двух отдельных preg_matches. Я не могу понять, как это показать, но он захватывает жирный тег в первой «БЕСПЛАТНОЙ доставке» и весь текст ниже, который выделен жирным шрифтом. Вы также можете увидеть морковь.

[1]=> 
    array(10) { 
    [0]=> 
    string(38) "$30.00<" 
    [1]=> 
    string(37) "$6.99<" 
    [2]=> 
    string(37) "$6.99<" 
    [3]=> 
    string(38) "$53.99<" 
    [4]=> 
    string(37) "$5.25<" 
    [5]=> 
    string(19) "& FREE Shipping<" 
    [6]=> 
    string(19) "& FREE Shipping<" 
    [7]=> 
    string(19) "& FREE Shipping<" 
    [8]=> 
    string(19) "& FREE Shipping<" 
    [9]=> 
    string(38) "$70.39<" 
    } 

Так что мой вопрос: Что я должен сделать, чтобы удалить тег и морковь от этого, так что я оставил с чистыми данным? Кроме того, запуск этих двух отдельных preg_match не работает для меня.

+0

удалить '<' от матча –

+0

Как это дубликат? Кажется довольно уникальным для меня. –

+0

@ smack-a-bro Поскольку разбор HTML с регулярным выражением является плохим, и ответ на связанный вопрос является предупреждением, которое нужно учитывать. *** Особенно ***, когда вы не контролируете исходный HTML. –

ответ

1

Не видя своего образца текста, трудно точно знать, что вам нужно. Но главное, что вам нужно сделать, - вывести этих «нежелательных» персонажей из группы захвата; затем использовать группу захвата в качестве чистых данных:

preg_match_all('/(?:& <b>|<span class="olpShippingPrice">)(.*?)</',$results,$match1); 
+0

Вот оно. Благодаря тонну. Считая, что я должен анализировать HTML с помощью RegEx, что нужно использовать? –

+0

@ smack-a-bro http://php.net/domdocument - мой предпочтительный метод. –

Смежные вопросы