使用RegEx查找字符串(作为变量号)

时间:2018-01-30 22:48:17

标签: php regex

如何在php中的某些字符串中找到数字?

例如,在页面中包含此文本,我想找到

|||12345||| 要么 |||354|||

我对这些数字感兴趣,他们总是根据我访问的页面进行更改(数字是页面的ID,长度为3-5个字符)。

所以我唯一知道的就是数字周围的管道。

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用此\|\|\|\K\d{3,5}(?=\|\|\|)
有很多好处。

https://regex101.com/r/LtbKfM/1

  1. 首先,没有量词的三个文字是一个简单的strncmp()c 呼叫。此外,只要正则表达式以断言开头,它就是 天生就慢了。因此,这是3的最快匹配 领先的管道符号。
  2. 其次,使用\K构造排除了先前的构造 从0组匹配。我们不想得到3个管道 匹配,但我们确实希望匹配它们。
  3. 修改

      

    请注意,捕获组结果不会存储在特殊字符串中   缓冲区。
      每个组实际上都是指针(或偏移)和长度   指针(或偏移量)位于源字符串中的某个位置   当提取特定组字符串时,支撑的重载功能
      matches[#]使用指针(或偏移量)和长度来创建和返回字符串实例   使用\K构造只需设置组0指针(或偏移)
      到字符串中代表
    的位置的位置   在\K构造之后匹配。

    1. 第三,对3个管道符号使用先行断言不会 就下一场比赛而言,消耗符号。这个 使这些符号可用于下一场比赛。即: ||| 999 {||| {1}} |||会得到2场比赛 ||| 888 {||||| {1}} |||。
    2. 结果是一个只有数字的数组。

      格式化

      999

答案 1 :(得分:0)

虽然@ S.Kablar的建议非常有效,但它使用的语法可能对初学者来说很难。

实现目标的更随意的方法如下:

$text = 'your input string';
if (preg_match_all('~\|{3}(\d+)\|{3}~', $text, $matches)) {
    foreach($matches[1] as $number) {
        var_dump($number); // prints smth like string(3) "345"
    }
}

正则表达式的细分:

  • ~~围绕着表达式
  • \|代表管道,这是正则表达式中的特殊字符,必须使用反斜杠进行转义
  • {3}说'之前的(管道)必须正好出现三次'
  • ()附上一个子模式,以便将其存储在$matches[1]
  • \d需要一个数字
  • +说'前一个(一个数字)可能会重复,但必须至少有一个实例'