Регулярное выражение XPath в сочетании с preg_match

#regex #preg-match

#регулярное выражение #preg-match

Вопрос:

У меня простая, но незаметная (для меня) ошибка в коде. Вы можете мне помочь?

С помощью этого кода в моем php-файле:

 $location = $xpath2->query("//script")->item(1)->textContent; 
  

Я получил (выбрал) это:

 <script class="" type="text/javascript">
//<![CDATA[                                   
var html = '';                             
var lat  = 44.793530904744074;                                        
var lang = 20.5364727973938;                              

if (GBrowserIsCompatible())
{
    var map = new GMap2(document.getElementById("map_canvas"));
    var ct = new GLatLng(lat, lang);
    map.setCenter(ct, 15);
    map.addControl( new GSmallMapControl() );
    //map.addControl( new GHierarchicalMapTypeControl () );
    var gm=new GMarker(ct);
    if(html != '') {
        GEvent.addListener(gm, "click", function() {
            this.openInfoWindowHtml( html );
        });
    }
    map.addOverlay(gm);
    map.enableContinuousZoom();
    map.enableInfoWindow();
}
//]]>
</script>
  

Затем я пытаюсь извлечь ‘lat’ и ‘lang’ с помощью этого кода:

 $location = $xpath2->query("//script")->item(1)->textContent; 

preg_match('/vars lats =s (d .d )s*;/', $location, $lat); 
preg_match('/vars langs =s (d .d )s*;/', $location, $lng); 
$data['lat'] = $lat[1]; 
$data['lng'] = $lng[1];
  

Но всегда показывайте, что lat и lang есть 0 , 0 когда они должны быть 44.34534 и 20.5345 .

ПОЖАЛУЙСТА, ПОМОГИТЕ! где вы думаете, что я ошибаюсь (мой английский не очень хорош, извините за это)

Комментарии:

1. Вы уверены lang , что оно правильно написано?

2. да, я уверен, потому что я копирую этот код. 100% — это «язык»

Ответ №1:

Может быть, что-то вроде приведенного ниже. Будьте осторожны, если вы пытаетесь проанализировать JavaScript.

preg_match( '/(?:^|(?<=s))vars lat s* = s* (?=[^;]*d) ([ -]?d*.?d*)s*; /x' , $location, $ lat);
preg_match( '/(?:^|(?<=s))vars langs* = s* (?=[^;]*d) ([ -]?d*.?d*)s*; /x' , $location, $ lng);

Запустите пример: http://www.ideone.com/SEgVb

Или просто попробуйте получить более общую информацию:

preg_match( '/(?:^|(?<=s))vars lat s*=s* ([^;]*) s*; /x' , …

Ответ №2:

Попробуйте так:

 preg_match('/vars lats =s ([d.-] )/', $location, $lat); 
preg_match('/vars langs =s ([d.-] )/', $location, $lng);
  

[d.-] соответствует любой группе с числами . или — (широта / долгота могут быть отрицательными)