kaçan tırnaklar için regex ifadesi php preg_match_all çalışmaz

3 Cevap php

Ben bir metin parçası içinde tırnakla maç için çalışıyoruz ve de bunun içinde kaçtı tırnak için izin veriyorum. Ben bir online test bu düzenli ifade denedim ve mükemmel çalışıyor. Ben preg_match_all denemek Ancak, bu ilk kaçtı dize başarısız.

İşte kod:

$parStr = 'title="My Little Website"
    year="2007"
    description="Basic website with ..."
    tech="PHP, mySQL"
    link="<a href=\"http://test.com\">test.com</a>"
';
$matches = array();

preg_match_all('/(\w+)\s*=\s*"(([^\\"]*(\\.)?)*)"/', $parStr, $matches, PREG_SET_ORDER); // Match[4][0] is 'link="<a href=\"'

Sadece ilk kaçtı alıntı kadar eşleştirerek, son maçında başarısız. I http://www.regexplanet.com/simple/index.html bu ifadeyi çalıştığınızda, mükemmel çalışıyor.

Regex bir yerinde bir parçasıdır:

"(([^\\"]*(\\.)?)*)"

Olmayan kaçtı alıntı bulunana kadar maç tam olduğu, süreç, 0 veya daha fazla kez tekrar edildiği isteğe bağlı kaçan alıntı yiyerek ardından kaçan bir teklif veya teklif, kadarki tüm metin yemelisiniz hangi.

Neden bu php çalışmaz? Neden çalışmıyor ve nasıl tamir edilmelidir?

3 Cevap

Bu php belirli bir sürümü için çalışmıyor neden bilmiyorum, ama olmayan bir açgözlü maç fikrini kullanarak, ben iş yapar bu dize ile geldi:

"(.*?[^\\\])"

Bir kaçış karakter öncesinde olmayan bir dbl-teklifi karşılaştığında kadar olmayan açgözlülükle her şeyi eşleşir. Bazı tuhaf nedenle, üç tersbölüler ihtiyaç vardır veya php eşsiz bir dirsek yakınıyor. Ben onun varlığı desteğini öncesinde bir ters eğik çizgi gerektirdiğini düşünüyorum, ama emin değilim. Üç ters eğik ihtiyaç vardır Herkes neden teyit edebilir?

/ Düzenle boşluk sınırı

Linux Fedora PHP 5.2.6 denedim ve gayet iyi iş gibi görünüyor. Çıktısı:

[wally@zf ~]$ php -f z.php
title="My Little Website"
    year="2007"
    description="Basic website with ..."
    tech="PHP, mySQL"
    link="<a href=\"http://test.com\">test.com</a>"

Nasıl böyle dersin?

preg_match_all('/(\w+)\s*=\s*"((?:.*?\"?)*)"/', $parStr, $matches, PREG_SET_ORDER);

Onun böyle ver

[1] => link
[2] => <a href=\"http://test.com\">test.com</a>

[] Içinde her şey, tek bir karakter olarak düşünün

için [^\\"], bu demek değildir EXCEPT \", bunun ortalama EXCEPT \ ve EXCEPT "

UPDATE Aynı Hattı Çoklu Değer için

preg_match_all('/(\w+)\s*=\s*"((?:[^\\\]*?(?:\\\")?)*?)"/', $parStr, $matches, PREG_SET_ORDER);

Source String, Sample

$parStr = 'title="My Little Website" year="2007" description="Basic website with ..." tech="PHP, mySQL" tech="PHP, mySQL" link="test.com" link="test.com" tech="PHP, mySQL" ';

Matches,

Array
(
    [0] => Array
        (
            [0] => title="My Little Website"
            [1] => title
            [2] => My Little Website
        )

    [1] => Array
        (
            [0] => year="2007"
            [1] => year
            [2] => 2007
        )

    [2] => Array
        (
            [0] => description="Basic website with ..."
            [1] => description
            [2] => Basic website with ...
        )

    [3] => Array
        (
            [0] => tech="PHP, mySQL"
            [1] => tech
            [2] => PHP, mySQL
        )

    [4] => Array
        (
            [0] => tech="PHP, mySQL"
            [1] => tech
            [2] => PHP, mySQL
        )

    [5] => Array
        (
            [0] => link="<a href=\"http://test.com\">test.com</a>"
            [1] => link
            [2] => <a href=\"http://test.com\">test.com</a>
        )

    [6] => Array
        (
            [0] => link="<a href=\"http://test.com\">test.com</a>"
            [1] => link
            [2] => <a href=\"http://test.com\">test.com</a>
        )

    [7] => Array
        (
            [0] => tech="PHP, mySQL"
            [1] => tech
            [2] => PHP, mySQL
        )

)

Şahsen, ben regex, gerçekten sevdim ile değil HTML ayrıştırma gibi hissediyor, ama seni önermek için başka bir seçenek, bu yüzden onun sadece bir hızlı ve kirli bir şekilde görmüyorum. Büyük bir proje veya büyük dosyalar için, ben bunun için gerçek bir ayrıştırıcı bulmak için öneririz.