PHP preg_match_all не будет искать значения

1

Я продолжаю искать два значения внутри строки. Я знаю, что мне нужно использовать следующую команду в PHP:

preg_match_all

Его также нужно избегать. Поэтому я попытался создать для этого фильтр.


Исходный код:

<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>

Мой фактический код:

if (preg_match_all("\<!\[CDATA\[([0-9a-z_-]+)\]\]\>\</var\>\<var n=\'destinationY\' t=\'n\'\>\<\!\[CDATA\[([0-9a-z_-]+)\]\]/i>", $packets, $matches) )

К сожалению, он не вернет данные, содержащиеся в CDATA. Поэтому я пытаюсь получить следующую информацию из этой строки:

Матч 1: 312.09999999999997

Матч 2: 510,75


Кто-нибудь знает, что я делаю неправильно?

  • 0
    Используйте синтаксический анализатор XML.
  • 0
    CData всегда будет содержать десятичное число?
Показать ещё 3 комментария
Теги:
preg-match-all
xml-parsing

3 ответа

1
Лучший ответ
$myString = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
preg_match_all('/CDATA\[([a-z0-9-\.]+)\]/i', $myString, $matches, PREG_PATTERN_ORDER);
print_r($matches[1]);

ВЫВОД

Array
(
    [0] => 312.09999999999997
    [1] => 510.75
)

LIVE DEMO

http://ideone.com/C3a7Ci

2

измените свое регулярное выражение на следующее:

/<!\[CDATA\[([0-9a-z_\-.]+)\]\]>/

вам нужно избежать буквенного дефиса или механизм регулярных выражений предполагает, что он ищет диапазон (например, 0-9 или az), и вы не разрешаете периоды.

Я поставил его в сценарий быстрого тестирования, используя предоставленную вами строку:

<?php

$matches;
$packets = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
preg_match_all('/<!\[CDATA\[([0-9a-z_\-.]+)\]\]>/i', $packets, $matches);
$matches = $matches[1];
print_r($matches);

Это дало мне такой результат:

Array ( [0] => 312.09999999999997 [1] => 510.75 )
0

Это должно получить значения между ними;

$packets = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
$regex = "~[0-9]+\.[0-9]+~";
preg_match_all($regex, $packets, $matches);

print_r($matches);
  • 0
    Это также будет захватывать десятичные значения за пределами блока CDATA, не уверен, если вы предназначались для этого
  • 0
    @ iam-decoder Ну, он показывает только одну строку и спрашивает нас, как получить два значения из одной строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню