preg_match 来自元名称的字符串

preg_match string from meta name

我想 preg_match 来自 $url1 的数字“20,956”和来自 $url2

的数字“2,894,865”

$url1:

<meta name="description" content="&#x200e;ST. Eye Clinic - &#x639;&#x64a;&#x627;&#x62f;&#x629; &#x62f;&#x643;&#x62a;&#x648;&#x631; &#x645;&#x62d;&#x645;&#x62f; &#x639;&#x632;&#x628; &#x644;&#x637;&#x628; &#x648; &#x62c;&#x631;&#x627;&#x62d;&#x629; &#x627;&#x644;&#x639;&#x64a;&#x648;&#x646;&#x200e;, Dumyat Al Jadidah, Dumyat, Egypt. 20,956 visits &#xb7;

$url2:

<meta name="description" content="ABC. 2,894,865 visits &#xb7;

试过这对两个 url 都有效,它只适用于 $url1 但不适用于 $url2

$p = preg_match("'Egypt. (.*?) visits'si", $url, $matches);
$p2 = preg_replace("/[^0-9]/", "", $matches[1]);      
print $p2;

有什么办法让它同时适用于 $url1 和 2 吗?

您可以使用

if (preg_match('~\d[,\d]*(?=\s*visits)~', $url, $matches)) {
  echo $matches[0];
}

参见regex demo详情:

  • \d - 一个数字
  • [,\d]* - 零个或多个 commas/digits
  • (?=\s*visits) - 正向前瞻,需要零个或多个空格,然后 visits 字符串紧接在当前位置的右侧。

看到一个PHP demo:

$urls = ['<meta name="description" content="&#x200e;ST. Eye Clinic - &#x639;&#x64a;&#x627;&#x62f;&#x629; &#x62f;&#x643;&#x62a;&#x648;&#x631; &#x645;&#x62d;&#x645;&#x62f; &#x639;&#x632;&#x628; &#x644;&#x637;&#x628; &#x648; &#x62c;&#x631;&#x627;&#x62d;&#x629; &#x627;&#x644;&#x639;&#x64a;&#x648;&#x646;&#x200e;, Dumyat Al Jadidah, Dumyat, Egypt. 20,956 visits &#xb7;',
    '<meta name="description" content="ABC. 2,894,865 visits &#xb7;'];
foreach ($urls as $url) {
  if (preg_match('~\d[,\d]*(?=\s*visits)~', $url, $matches)) {
    echo $matches[0] . PHP_EOL;
  }
}

输出:

20,956
2,894,865