2016-12-30 8 views
-3

Как impliment ИЛИ здесь, чтобы соответствовать meta с обоими name и propertypreg_match мета имя или свойство

$html = '<meta name="title" content="title here.."> 
     <meta name="keywords" content="keywords here.."> 
     <meta property="og:title" content="og title here..">' 

preg_match_all('/<[\s]*meta[\s]*name="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $html, $match); 

выход

Array 
(
    [0] => Array 
     (
      [0] => <meta name="title" content="title here.."> 
      [1] => <meta name="keywords" content="keywords here.."> 
     // [2] <meta property="og:title" content="og title here.."> 
     ) 

    [1] => Array 
     (
      [0] => title 
      [1] => keywords 
     // [2] => og:title 
     ) 

    [2] => Array 
     (
      [0] => title here.. 
      [1] => keywords here.. 
     // [2] => og title here.. 
     ) 

) 
+0

Вы должны использовать синтаксический анализатор, но в регулярном выражении есть 'или'. Вы смотрели какие-то документы? http://www.regular-expressions.info/alternation.html – chris85

+0

@ chris85 предпочитает парсер, чем регулярное выражение? – TheMonkeyKing

+0

Да, с парсером вам не нужно беспокоиться о пробеле, порядке атрибутов, типе значений типа инкапсуляции значений атрибутов и т. Д. Если это вопрос только регулярного выражения, я думаю, что моя предыдущая ссылка должна ответить на это. Однако HTML/XML не предназначены для обработки с помощью регулярных выражений. – chris85

ответ

0

Как узнал из предложенной ссылки на @ Chris85, (name|property) будет делать это. Виноват!

preg_match_all('/<[\s]*meta[\s]*(name|property)="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $html, $match); 
+1

Если вам не требуется захват 'name' /' property, вы можете сделать его не захватывающей группой с '?:'. например '(: Название | недвижимость)' – chris85