У меня есть следующий пример текста
<p>in <span class="nanospell-typo">der</span> <span class="nanospell-typo"><dreipc data-type="abbreviation" data-uid="41">DDR</dreipc></span> <span class="nanospell-typo">kollaborieren</span>, <span class="nanospell-typo">gibt</span> es</p>
<li>per Post an <strong><dreipc data-type="abbreviation" data-uid="48">someAbbreviation</dreipc>, 10106 Berlin</strong> oder</li>
и следующие два шаблона регулярных выражений:
/(?:\<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:\>)(.*?)(?:\<\/dreipc\>)/
/(?:<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:>)(.*?)(?:<\/dreipc>)/
Первый Regex работает на regex101.com и в php. Второй соответствует regex101.com, но не соответствует php. Я не понимаю, почему. На самом деле мне нужно только первое регулярное выражение, но тогда я не получаю совпадений, когда есть htmnlentities. Вот почему я включил второй шаблон регулярного выражения. Я также не хочу использовать html_entity_decode в своей строке. Строка в основном очень длинная, и я не хочу декодировать htmlentities, которые могут потребоваться.
Мой php-код выглядит так:
class MyClass {
const DREIPC_REGEX = '/(?:\<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:\>)(.*?)(?:\<\/dreipc\>)/';
const DREIPC_REGEX_HTMLENTITIES = '/(?:<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:>)(.*?)(?:<\/dreipc>)/';
public static function pregMatchHTMLNode($string = '')
{
$result = [];
preg_match_all(self::DREIPC_REGEX, $string, $matches, PREG_SET_ORDER, 0);
preg_match_all(self::DREIPC_REGEX_HTMLENTITIES, $string, $matchesHtmlentities, PREG_SET_ORDER, 0);
$matches = array_merge($matches, $matchesHtmlentities);
... doing some other things with matches
return $result;
}
}
Так что лучше всего было бы заставить preg_match_all() работать с моим вторым шаблоном. Но как?
var_dump($string);
вpregMatchHTMLNode()
- person revo   schedule 21.05.2018