2013-02-25 2 views
2

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

<th valign="top"> Prize pool: 
</th> 
<td> $75,000 
</td></tr> 

Излишне говорить, что значение призового фонда изменится. Я хочу получить приз и только приз от этой части (в этом примере скрипт должен распечатать 75 000 долларов).

Это то, что я до сих пор:

preg_match('/Prize pool:\n<\/th>\n<td>(.*)/i', $file_string, $prize); 

Однако это печатает:

Prize pool: 
</th> 
<td> $75,000 
+2

В то время как комментарий @ JohnConde вполне верен, лучшим ответом здесь является то, что вы должны использовать что-то вроде http://php.net/domdocument. –

+1

put '// th [содержит (текст(), 'Prize pool')]/td' в https://gist.github.com/1358174 – Gordon

+0

Если значение всегда будет знаком доллара, за которым следуют цифры, не могли бы вы просто искать доллар и любые цифры/запятые после? – Matt

ответ

1
preg_match('/Prize pool:.+(\$\d+(?:\.|,)\d+)/is', $file_string, $prize); 
echo '<pre>' . print_r($prize, 1) . '</pre>'; 

Как это.

Небольшое пояснение

. - поиск любого одного символа, но не новой строки символ «\ п»

+ - означает один или более повторений

Итак, .+ означает, что после того, как «Призовой фонд:« должно быть больше одного ».

(...) Это называется карман. Каждый карман в регулярном выражении будет находиться в каждый элемент массива ($prize)

$ в скороговоркой означает, как конец строки, поэтому необходимо преобразование его в одном полукокса вытекания ее, как этот \$

\d - средство один номер от 0 до 9. и \ D + один или несколько номеров

(?:...) это карман тоже, но это не будет сохранен в $ приз, потому что мы использовали ?: после (

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

/here pattern/i модификатор i здесь означает, что регулярное выражение не будет чувствительно к регистру

/here pattern/s modificator s означает, что метасимвол . будет включать символ новой строки.

0

Prize pool:\s*<\/th>\s*<td>\s+(.*)\s+<\/td>

Если вы хотите, чтобы разобрать HTML, чтобы получить только это значение, просто использовать регулярное выражение; Не нужно использовать полный парсер HTML для захвата числа из строки html.

Используйте Rubular, чтобы проверить регулярное выражение.