2012-03-23 4 views
1

Пытается захватить числа перед (h), (w) и (d). Они динамичны, и я не могу получить синтаксис для этого:PHP Regex, чтобы получить номера перед строкой с круглыми скобками

<ul> 
     <li>Make: Mymake</li> 
     <li>Model: R-22GTF</li> 
     <li>Dimensions: 13.25&#34; (h) x 20.13&#34; (w) x 18.5&#34; (d)</li> 
     <li>Sold Individually </li> 
     <li>Weight: 0 lbs.</li> 
    </ul> 

if (preg_match("/Dimensions: ((?:\d+)(?:\.\d*)?)/", $desc, $DIMS) == true) 
    { echo $DIMS[1];} 

выше возвращается только 13.25. Я бы хотел, чтобы каждый в своем собственном массиве или собственной переменной. Каждый из них определяется числом до (h), числом до (w) и числом перед (d).

+0

Звучит как отличная возможность исследовать синтаксис регулярных выражений, поскольку это не сложно или сложно. Я предлагаю попробовать *** узнать ***, а не бежать к SO, чтобы заставить кого-то другого сделать это за вас. '(?:' говорит PHP, что вы *** не хотите, чтобы захватить группу в круглых скобках. – rdlowrey

+0

Забавно, что я искал час, что это значит, и Google не мог помочь мне объяснить это. – ToddN

+0

* (совет) * http://www.regular-expressions.info – Gordon

ответ

3
<?php 

$input = "  
    <ul> 
     <li>Make: Mymake</li> 
     <li>Model: R-22GTF</li> 
     <li>Dimensions: 13.25&#34; (h) x 20.13&#34; (w) x 18.5&#34; (d)</li> 
     <li>Sold Individually </li> 
     <li>Weight: 0 lbs.</li> 
    </ul>"; 

$re = '/.* (\d+\.\d+).*\(h\) .* (\d+\.\d+).*\(w\) .* (\d+\.\d+).*\(d\)/'; 
if(preg_match($re, $input, $matches)) 
    echo sprintf("H: %s W: %s D: %s\n", $matches[1], $matches[2], $matches[3]); 
?> 
+0

Это не будет соответствовать' "13.25 " (h) x 20.13 " (w) x 18.5 " (d)" или "13.25 " (h) (w) (d) ", но ОП иногда не знают о проблемах со скребками. – sln

+0

Правда, но результат выглядит как нечто, созданное сервером, поэтому кажется безопасным предположить, что эти изменения не будут происходить. Если сервер изменяет статические части, т. Е."(h) x" vs "(h) x" или пишет "" вместо "0.00 "", то кто знает, чего ожидать от этого сервера. И если это действительно так, то я думаю, что OP действительно должен изучить небольшое регулярное выражение. ;-) – Weston

2

Попробуйте регулярок приведенную ниже, надеюсь, я хорошо понимал, что вы пытаетесь извлечь :)

[\d.]+(?=&) 

EDIT:

глобальное регулярное выражение

/[\d.]+(?=&)/g 

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

http://gskinner.com/RegExr/

Это будет соответствовать вашему выражению, как вы их.

+0

По моему мнению, это только захват «13.25» снова. Мне нужно попробовать и захватить другие числа, а также перебросить их в переменную. – ToddN

+0

если он не захватит все, попробуйте его с глобальной итерацией, как в моем отредактированном сообщении –

+0

Приятная ссылка на регулярное выражение -tra ining tool ... Это было какое-то время, так как я играл с регулярными выражениями :) – snaderss

1

Вы должны быть в состоянии сделать print_r ($ тускнеет) на этом

Dimensions:[^\d.;(<]*([\d.]*)[^;(<]*;[^(<]*\(h\)[^\d.;(<]*([\d.]*)[^;(<]*;[^(<]*\(w\) [^\d.;(<]*([\d.]*)[^;(<]*;[^(<]*\(d\)

расширил

Dimensions: 
    [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(h\) 
    [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(w\) 
    [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(d\) 

Ее немного строги по проверке, но его жадный, так необходимы избыточные ограничения переполнения. Вы можете просто заменить отрицательные классы .*?, если хотите.

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