regex help - php - PullRequest
       27

regex help - php

1 голос
/ 04 июня 2010
$data = "<Data>hello</Data>";
preg_match_all("/\<Data\>[.]+\<\/Data\>/", $data, $match);
print_r($match);

Возвращает:

Array ( [0] => Array ( ) )

Значит, я предполагаю, что совпадение не сделано?

Ответы [ 6 ]

2 голосов
/ 04 июня 2010
<?php

$data = "<Data>hello</Data>";
preg_match_all('#<Data>(.+)</Data>#', $data, $match);
print_r($match);

?>

Вывод: ( как видно на ideone.com )

Array
(
    [0] => Array
        (
            [0] => <Data>hello</Data>
        )

    [1] => Array
        (
            [0] => hello
        )

)

[...] - определение класса символов. Вы используете (...) для захвата.

Ссылки


Специальное примечание по сопоставлению неохотных

Поскольку вы используете preg_match_all, следует отметить, что вы в настоящее время жадно подходите. То есть есть только одно совпадение, скажем, <Data>hello</Data><Data>how are you</Data> ( см. На ideone.com ).

Если вам нужны оба элемента <Data>, то вы должны использовать сопоставление с неохотой '#<Data>(.+?)</Data>#' ( см. На ideone.com ).

Для иллюстрации:

----A--Z----A----Z----
    ^^^^^^^^^^^^^^
        A.*Z

В приведенном выше входе есть только одно A.*Z совпадение.


Специальное примечание по регулярному выражению для разбора HTML / XML

Это боль. Если это вообще возможно, используйте правильный анализатор HTML / XML. Есть много для PHP.

2 голосов
/ 04 июня 2010

Вы используете [] и. неправильно.

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

$data = "<Data>hello</Data>";
preg_match_all("/\<Data\>.+\<\/Data\>/", $data, $match);
print_r($match);

Когда вы используете [] ваш определяющий список возможных символов, в вашем случае эти символы, которые вы определили, ограничены. только. Если вы хотите использовать. чтобы определить любой символ, вы должны использовать его за пределами [].

2 голосов
/ 04 июня 2010
preg_match_all("#<Data>.+</Data>#", $data, $match);

Если вы хотите использовать / в качестве разделителя:

preg_match_all("/<Data>.+<\/Data>/", $data, $match);

Основная проблема заключалась в том, что . внутри класса символов соответствует буквальному периоду.Кроме того, использование другого разделителя исключает возможность экранирования.Обратите внимание, что вам не нужно бежать < в любом случае.Если вы хотите иметь возможность извлечь внутреннее значение, используйте:

preg_match_all("#<Data>(.+)</Data>#", $data, $match);

"hello" теперь будет в $matches[1] в вашем примере.Обратите внимание, что регулярное выражение не подходит для анализа XML, поэтому переключитесь на реальный синтаксический анализатор для чего-то нетривиального.

1 голос
/ 04 июня 2010

Внутри классов символов точка - это просто точка.

<?php  

    $data = "<Data>hello</Data>";
    preg_match_all("/\<Data\>.+\<\/Data\>/", $data, $match);
    print_r($match);

?>

даст:

Array
(
    [0] => Array
        (
            [0] => <Data>hello</Data>
        )

)
0 голосов
/ 04 июня 2010
/<Data>([^<^>]+)\<\/Data\>/

$data = "<Data>hello</Data>";
preg_match_all("/<Data>([^<^>]+)\<\/Data\>/", $data, $match);

print_r($match);
0 голосов
/ 04 июня 2010

Попробуй это. вам не нужны скобки вокруг.

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