获取指定长度的字符串

时间:2016-02-18 10:29:24

标签: php regex

假设有一个数组如下:

$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');

我只需要包含 4 字符的元素。所以除 foo12345bar 外,其他3个元素都有效。

因为'\d{4}'会匹配 foo12345bar ,所以我会笨拙地尝试:

$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
$result = array();
foreach ($arr as $value) {
    preg_match('/\d+/', $value, $match);
    if (strlen($match[0]) != 4) {
        continue;
    }
    $result[] = $value;
}
var_dump($result);    //array('foo1234bar', 'foo1234', '1234bar')

是否有直接匹配的正则表达式(因此可以省略 if 条件)?先感谢您。

6 个答案:

答案 0 :(得分:5)

使用环顾正则表达式和preg_grep function

,这很容易处理
$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
print_r(preg_grep('/(?<!\d)\d{4}(?!\d)/', $arr));

RegEx分手:

(?<!\d)  # assert previous char is not a digit
\d{4}    # match exact 4 digits
(?!\d)   # assert next char is not a digit

<强>输出:

Array
(
    [0] => foo1234bar
    [1] => foo1234
    [2] => 1234bar
)

答案 1 :(得分:1)

修改你的正则表达式如下

/^\D*\d{4}\D*$/

^你的字符串必须以
开头 \D任何非数字字母 *从0到无限次重复 \d{4}后跟任意数字完全重复4次 \D后跟任何非数字字母 *从0到无限次重复 $字符串的结尾

此外,您可以按如下方式修改代码

$arr = array('foo1234bar', 'foo1234', '1234bar', 'foo12345bar');
$result = array_filter(
    $arr,
    function($element) {
        return preg_match('/^\D*\d{4}\D*$/', $element); 
    }
);

var_dump($result);

注意

由于OP没有指定它,这个正则表达式甚至会匹配1234(前面或后面没有非数字字符的任何四位数字符串)。如果他希望在前面或后面至少有一个字符,那么必须改变这个正则表达式。

答案 2 :(得分:1)

假设数字前后的字符始终是按字母顺序排列的,您可以使用此正则表达式:

^[a-zA-Z]*\d{4}[a-zA-Z]+$

答案 3 :(得分:0)

正则表达式为\ d {4}

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    	    version="2.5">

      <display-name>Archetype Created Web Application</display-name>
      
      <servlet>
    		<servlet-name>dispatcher</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<load-on-startup>1</load-on-startup>
    	</servlet>

    	<servlet-mapping>
    		<servlet-name>dispatcher</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>

    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    	</context-param>

    	

      <!-- Add this to your web.xml to enable "CORS" -->
    	<filter>
    	  <filter-name>cors</filter-name>
    	  <filter-class>com.demo.mongo.example.filter.CORSFilter</filter-class>
    	</filter>
    	  
    	<filter-mapping>
    	  <filter-name>cors</filter-name>
    	  <url-pattern>/*</url-pattern>
    	</filter-mapping>
    </web-app>

期待会有所帮助

答案 4 :(得分:0)

您可以尝试下列内容:
preg_match('/\D\d{4}\D/', $value, $match);

它搜索:

不是数字(/ D)
4位数(/ d {4})
再次是非数字(/ D)

答案 5 :(得分:0)

此正则表达式适用于您的所有示例:

'/^\D*(\d{4})\D*$/'
  ││   │     │  └── end string
  ││   │     └───── zero or more NOT digits
  ││   └─────────── four digits ( match 1 )
  │└─────────────── zero or more NOT digits
  └──────────────── start string

如果字符串中有多个数字组('123abc1234o'),它们就不起作用。