Это будет работать:
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
Символ ?
означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s)
будет соответствовать символу -
или |
. Добавление ?
после второго появления этой группы в вашем регулярном выражении позволяет вам сопоставить последовательность из десяти последовательных цифр.
Если вы ищете список этих атрибутов, XPath будет вашим другом
print_r($xml->xpath('@token'));
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;
$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]
Используйте SimpleXMLElement::attributes
.
Истина заключается в том, что обработчик SimpleXMLElement get_properties
занимает большое время. Нет свойства с именем «@attributes», поэтому вы не можете делать $sxml->elem->{"@attributes"}["attrib"]
.
get_properties
). Очень интересно.
– andrewtweber
2 April 2014 в 06:05
К сожалению, у меня есть уникальная сборка (застрявшая с Gentoo на данный момент) PHP 5.5, и я обнаружил, что
$xml->tagName['attribute']
был единственным решением, которое сработало. Я пробовал все методы Боры выше, в том числе «Right & amp; Quick ', и все они потерпели неудачу.
Тот факт, что это самый простой формат, является плюсом, но мне не нравилось думать, что я безумно пытался использовать все форматы, о которых говорили другие.
Njoy за то, что его стоит (я упомянул уникальную сборку?).
Это помогло мне преобразовать результат simplexml_load_file ($ file) в структуру JSON и декодировать его обратно:
$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);
$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);
>> result: SimpleXMLElement Object
(
)
$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);
>> result: stdClass Object
(
[key] => value
)
attributes()
для объекта, соответствующего правильному тегу в вашем XML. Например, если у вас есть <root><tag attr="a">b</tag></root>
, вам нужно сделать $xml->tag->attributes()->attr
для доступа к нему.
– zysoft
12 September 2015 в 22:30
$b
будет объектомSimpleXMLElement
, поэтомуprint_r
иvar_dump
дадут вам странные вещи. Вы можете использовать его как строку (или что угодно), чтобы обойти это. – jxmallett 16 April 2014 в 01:39$xml->attributes()->{'field'}
,$xml->attributes()->field
и$f='field'; $xml->attributes()->$f;
совпадают. Не вижу причин, почему один правильный формат, а другой неправильный. – zysoft 12 September 2015 в 22:36