универсальный код регулярного выражения - PullRequest
1 голос
/ 28 октября 2011

Я новичок в веб-разработке, особенно в коде регулярных выражений, и хочу знать, возможно ли написать универсальный код, который будет извлекать координаты сайтов независимо от того, находятся ли они в коде iframe, URL-адресе изображения или в JavaScript.

<div id="g_map"></div>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=key" type="text/javascript"></script>
<script type="text/javascript"> 

//<![CDATA[

var html = '';    
var lat  = 44.799439;
var lang = 20.483494;
if (GBrowserIsCompatible())
{
...

второй пример:

<div class="map">
    <iframe frameborder="0" border="0" scrolling="no"  marginwidth="0" marginheight="0" title=""  
          src="http://www.kolektiva.rs/beograd/dailydeal/vendor/map/center/44.79848,20.473856/"></iframe>
</div>

Можно ли сначала удалить все символы и все символы, которые были только координатами десятичной точки, и поэтому они занимают?

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Первый пример :

Оценка следующего выражения XPath 1.0:

normalize-space(translate(.,translate(.,' 0123456789.', ''), ' '))

производит :

44.799439 20.483494

Это может быть сделано с любым механизмом XPath, и узел контекста должен быть узлом документа или в XSLT 1.0, как показано ниже :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:value-of select=
     "normalize-space(translate(.,translate(.,' 0123456789.', ''), ' '))
     "/>
 </xsl:template>
</xsl:stylesheet>

При применении к этомуXML-документ (такой же, как предоставленный, но завершенный):

<html>
    <div id="g_map"></div>
    <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=key" type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
        var html = '';
        var lat  = 44.799439;
        var lang = 20.483494;
        if (GBrowserIsCompatible())
        {}
    ]]>
</script>
</html>

результат :

44.799439 20.483494

Второй пример:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:for-each select="//*/@src">
  <xsl:value-of select=
   "normalize-space(translate(.,translate(.,' 0123456789.', ''), ' '))
   "/>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

производит :

..44.7984820.473856

и требует чуть больше очистки.


II.Более серьезная обработка (XPath 2.0 / XSLT 2.0)

Это преобразование действительно "универсально" и работает на обоих примерах :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:analyze-string select="string-join((.,//*/@*), ' ')"
                         regex="\-?\d+\.\d+">
     <xsl:matching-substring>
       <xsl:sequence select="concat(., ' ')"/>
     </xsl:matching-substring>  
     </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

При применении ко второму XML :

<div class="map">
    <iframe frameborder="0" border="0" scrolling="no"  marginwidth="0" 
             marginheight="0" title=""               
src="http://www.kolektiva.rs/beograd/dailydeal/vendor/map/center/44.79848,20.473856/">
</iframe>

желаемый, правильный результат получается :

44.79848  20.473856 

при применении к XMLдля первого примера он также дает желаемый результат :

44.799439  20.483494 

0 голосов
/ 28 октября 2011

Я не уверен на 100%, что правильно истолковал ваш вопрос. Но если вам нужно извлечь числа 44.79848 и 20.473856 из двух предоставленных вами фрагментов (не сильно отличающихся от приведенных выше), тогда да, нет проблем.

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

Я думаю, вы должны быть более конкретны в своем вопросе, если вы хотите получить более конструктивные ответы, которые действительно могут вам помочь.

...