Возникли проблемы с функцией substr в PHP - PullRequest
0 голосов
/ 30 января 2012

У меня есть такая строка:

$geometry = "POINT (1.5041909054501184 0.39827301781943014)"

Я должен разделить два десятичных значения 1.5041909054501184 и 0.39827301781943014 на основе пробела в массив.Для этого, как и ожидалось, мне нужно отрубить 'POINT (' и ')' от $geometry.

Я пробовал следующие строки:

$temp = substr($geometry , strpos($geometry, "(")+1, strlen($geometry)-2);

и

$temp = substr($geometry , strpos($geometry, "(")+1, strpos($geometry, ")")-1);

Повтор $temp в обоих случаях отображает строку как:

"1.5041909054501184 0.39827301781943014)"

Как мне удалить ')' из строки $geometry?

ОБНОВЛЕНИЕ

Как я могу обобщить это на строки, подобные этим?

$geometry = "POINT (1.5041909054501184 0.39827301781943014)";

и

$geometry = "POLYGON ((1.5049088554391572 0.39805485932781448, 1.5049135685638309 0.39805660717232405, 1.5049147247575003 0.39805462248168044, 1.5049101547531727 0.39805287533491257, 1.5049088554391572 0.39805485932781448))";

Ответы [ 6 ]

2 голосов
/ 30 января 2012

Я бы просто использовал регулярное выражение:

$geometry = "POINT (1.5041909054501184 0.39827301781943014)";
preg_match_all('/POINT \((\d\.\d+) (\d\.\d+)/ ', $geometry, $matches);

$matches[1][0]; // => "1.1.5041909054501184"
$matches[2][0]; // => "0.39827301781943014"

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

1 голос
/ 30 января 2012

Попробуйте это:

$str = 'POINT (1.5041909054501184 0.39827301781943014)';
// Remove any character that is not digit, dot or space, then trim whitespace
$stripped = trim(preg_replace('/[^0-9 \.]/', '', $str));
// Split by the space in the middle
$exploded = explode(' ', $stripped);

print_r($exploded);
/*
  Array
  (
      [0] => 1.5041909054501184
      [1] => 0.39827301781943014
  )
*/
1 голос
/ 30 января 2012

Может лучше с preg_replace?

$geometry = "POINT (1.5041909054501184 0.39827301781943014)";

echo preg_replace('/POINT \((.*?)\)/uis','$1',$geometry);
1 голос
/ 30 января 2012

Ну, а почему бы просто не удалить их?

$geometry = "POINT (1.5041909054501184 0.39827301781943014)";
$temp1 = str_replace("POINT (", "", $geometry);
$temp = str_replace(")", "", $temp1);

Предполагая, что ваш синтаксис геометрии всегда одинаков, это будет хорошо.

Кроме того, поскольку вы начинаете с 7 символов заранее и хотите нарезать последний, задайте для аргумента $length значение length-8:

$temp = substr($geometry , strpos($geometry, "(")+1, strlen($geometry)-8);

Оба эти эхо правильно.


Редактировать!

Основано на комментариях:

Попробуйте это:

$temp = preg_replace("|.+\((.+)\)|", "$1", $geometry);
0 голосов
/ 30 января 2012

Параметр 3d должен быть длиной подстроки, а не позицией в исходной строке

0 голосов
/ 30 января 2012

Третий аргумент для substr - это не «конечная точка», а «длина подстроки».

Так что вам нужно сказать:

$start_pos = strpos($geometry, "(")+1;
$temp = substr($geometry , $start_pos , strlen($geometry)-$start_pos);

Затем вы можете использовать explode, чтобы получитьдва десятичных знака;

list($x, $y) = explode(' ', $temp);

или

$coordArray = explode(' ', $temp);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...