2012-06-21 2 views
1

Я новичок в php, и мне нужна рука. У меня ширина по высоте, которые выводятся на одну строку (ширина x высота). Мне нужно отделить ширину и высоту. Размеры всегда будут меньше 100, но могут включать десятичные значения. Также есть возможность пробелов до или после измерений.Регулярное выражение для отдельных измерений

Вот несколько примеров размеры: 8x10, 10x12, 24.5x36.625

Я думаю, что я мог бы выполнить задачу, используя StrPos и ​​SUBSTR, но было бы регулярное выражение быстрее? более элегантный? более точным? [побочный вопрос: что такое хороший способ изучения регулярного выражения? есть ли какие книги/сайты вы порекомендовали?]

$string=' 8.5x10'; 
$string=trim($string); 
$x = stripos($string,'x'); 
$size1 = substr($string, 0, $x); 
$size2 = substr($string, $x+1); 
echo $size1 . '<br />'; 
echo $size2; 

ответ

4
$string = '8.5x10'; 
list($width, $height) = explode('x',$string); 
+0

Это правильный ответ ... нет регулярных выражений необходимо. Ему просто нужно исправить свой код. – Galen

+0

Определенно самое простое решение. Спасибо кучу – TimSum

0
$string=' 8.5x10'; 
$array = explode('x',$String); 
var_dump($array); 

$ массив [0] => будет иметь size1, $ массив [1] => будет иметь size2

1

Интернет полон учебных пособий по регулярным выражениям, вам просто нужно быть немного осторожными, поскольку вокруг них находятся различные семьи (perl, old-school unix ...)

Что касается вашей проблемы, substtring решение является самым про возможно, будет быстрее, поскольку регулярные выражения переводятся в конечное состояние machie, которое может стать довольно сложным ...

Хорошо, когда формат свободен, поскольку он позволяет быстро (программист мудрый) определять формат, проверять его и извлекать данные.

В вашем случае: (\d+(\.\d*)?)x(\d+(\.\d*))

  • \d: соответствует одной цифры
  • + предыдущий блок появляется один или более
  • * появляется предыдущий блок ноль или один или несколько раз
  • ? предыдущий блок появляется ноль или один раз
  • () определить блок

, например. : d+ будет соответствовать 1, 12, 158

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

Если не использовать регулярное выражение, когда нужно «контекстный» разбор (например: формат строка зависит от предыдущей информации)

Надеется, что это помогает

+0

Супер полезно. Большое спасибо за ваш вклад. – TimSum

0

Во-первыхам, избавиться от всех пробелов, а затем разбить строку на x характере. Использование list() упрощает разбиение массива на отдельные переменные.

$string = "1.23 x5 "; 
$string = str_replace(" ", "", $string); 
list($width, $height) = explode("x", $string); 

Вы также можете бросить значения с плавающей точкой, просто чтобы убедиться, что они на самом деле цифры:

$width = (float)$width; 
$height = (float)$height; 
+0

'explode (" x ", $ string);' может быть? =) – k102

+0

@ k102 Спасибо за это. Мой телефон не создает лучшую ответную платформу ': P'. – Bojangles