2012-02-09 3 views
0

Я все еще получаю голову над регулярным выражением и мало-помалу. Это вызывает у меня головную боль. У меня есть строка, как показано ниже:PHP preg_replace - regex

".......mapsearch"), '52.486683, -4.044363', options......" 

Я хочу, чтобы извлечь 2 номера (длинный & LAT) из строки - Я не против, если я получить их вместе в виде одной строки в комплекте с запятой и пространство между ними.

Я знаю, что хочу использовать выражение, чтобы соответствовать и игнорировать что-либо от начала до и включать mapsearch"), ' и то же самое для конца строки в шаблон ', options.

ОБНОВЛЕНИЕ

Строка будет также содержать ряд других символов, таких как {}() =:/и цифры до и после желаемого матча ..

+0

Почему бы не взорваться, ', затем петлю и проверить, если это поплавок/INT, чтобы сохранить его? – MetalFrog

+0

- это только 2 числа, которые присутствуют в строке? – ThinkingMonkey

+0

Является ли это линией из файла CSV? Вам лучше использовать парсер для них. – Qtax

ответ

3

Это будет работать, так как некрасиво, как это:

/mapsearch\"\), '(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)', options/ 

Номера могут быть отрицательными или положительными, а также соответствовать целым и десятичным значениям. Шаблон вернет оба числа в виде отдельной группы.

+2

Разбивка как '(-? \ D + (?:. \ D +)?)' Works: '-?' Ищет необязательный главный отрицательный знак, за которым следует количество чисел ('\ d +'). После начального набора чисел мы хотим сопоставить десятичное число и количество чисел ('(?:. \ D +)?'), Но мы не хотим, чтобы это была собственная группа захвата ('?:') , –

+0

Возвращает массив из 3-х предметов: 1-й из них, 2-й и 3-й, возвращающий каждую переменную, тем не менее работает. Благодарю. – digout

+0

preg_match (и большинство других регулярных выражений, которые я видел) всегда будет возвращать полный матч в качестве первой группы. Вот почему есть 3 предмета. –

0

В этом случае я бы воспользовался решением metalfrog с некоторыми изменениями.

Если вы уверены, что только строка имеет запятую, ничего больше, а затем взорваться и проверить, является ли это целым числом/float ИЛИ, если вы знаете, что это n-й элемент, просто получите $ array [$ n] ,

Else взрывается и использует this (требуется некоторое редактирование), чтобы определить, является ли это координатой или нет.

0

Предполагая, что это единственные номера в одинарные кавычки:

'-?\d+.\d+, -?\d+.\d+' 
1
preg_match("/'([^,]+), ([^']+)'/", $string, $matches); 
echo $matches[0]; // 52.486683 
echo $matches[1]; // -4.044363 
0

Вы можете попробовать это:

(\-?[0-9]+\.[0-9]+\,\ \-?[0-9]+\.[0-9]+) 

извлечь

52.486683, -4,044363

0
$subject = ".....mapsearch\"), '52.486683, -4.044363', options......"; 
$regex = '/mapsearch\"\), \'(-?[0-9]{1,3}\.[0-9]{6}, -?[0-9]{1,3}\.[0-9]{6})\', options/'; 
if (preg_match($regex, $subject, $matches)){ 
    print_r($matches); 

Это даст вам:

Array 
(
    [0] => mapsearch"), '52.486683, -4.044363', options 
    [1] => 52.486683, -4.044363 
)