PHP在描述中的#之后获取字符

时间:2017-08-02 18:50:30

标签: php

如何将以下描述中提到的每个产品标识号变为变量,不包括#从PHP中的描述中提取它们?

  

两个9-dram透明苯乙烯管,带有卡扣帽,1 x 2-3 / 4“I.D。   (25.2 x 68毫米),作为容器提供。附加或替换   管#8909 可用。

     

作为安全预防措施,BioQuip建议使用#1135Y HEPA   用这个吸气器过滤。

     

另见#1135X 吸气器注射器灯泡。它允许用户吸气   标本没有吸入颗粒物。

3 个答案:

答案 0 :(得分:1)

解决方案

使用Regex。我写的这个正则表达式(\#.+?)(注意末尾的空格)与产品ID号匹配。试一试here。要在PHP中使用正则表达式,请使用preg_match_all

  

preg_match_all

     

(PHP 4,PHP 5,PHP 7)preg_match_all - 执行全局常规   表达式匹配

     

描述

     

int preg_match_all(string $ pattern,string $ subject [,array   & $ matches [,int $ flags = PREG_PATTERN_ORDER [,int $ offset = 0]]])

代码

<?php
    $pattern = "/(\#.+?) /";
    $string = "Two 9-dram clear styrene tubes with snap-on caps, 1 x 2-3/4″ I.D. (25.2 x 68mm), are supplied as containers. Additional or replacement tubes #8909 are available. As a safety precaution, BioQuip recommends using the #1135Y HEPA filter with this aspirator. Also see #1135X aspirator syringe bulb. It allows users to aspirate specimens without inhaling particulate matter.";
    preg_match_all($pattern, $string, $matches);
    print_r($matches[0]);
?>

输出

Array
(
    [0] => #8909
    [1] => #1135X
    [2] => #1135Y
)

有了数组,您可以通过从$matches[0]抓取代码来访问找到的代码。例如,要打印第一个匹配项,只需执行以下操作:

$matches[0][0]

第二场比赛:

$matches[0][1]

并且,如果你想真正想象,你可以将它打印到表格中:

<?php
    $pattern = "/(\#.+?) /";
    $string = "Two 9-dram clear styrene tubes with snap-on caps, 1 x 2-3/4″ I.D. (25.2 x 68mm), are supplied as containers. Additional or replacement tubes #8909 are available. As a safety precaution, BioQuip recommends using the #1135Y HEPA filter with this aspirator. Also see #1135X aspirator syringe bulb. It allows users to aspirate specimens without inhaling particulate matter.";
    preg_match_all($pattern, $string, $matches);

    echo "<table border='1' style='border-collapse: 
    collapse;border-color: silver;'>";  
    echo "<tr style='font-weight: bold;'>";  
    echo "<td width='150' align='center'>Product Codes</td>";  
    echo "</tr>";

    foreach ($matches[0] as $match) 
     { 
      echo '<td width="150" align=center>' . $match . '</td>';
      echo '</tr>';
     }
?>

这将输出:

Product code table

试一试

PHP Sandbox

答案 1 :(得分:0)

可以使用这个正则表达式(正则表达式):

/#(\w+)/

preg_match_all()一起执行全局搜索匹配正则表达式的数据,并将其在数组中找到的内容存储,如下所示:

<?php

$str = "Two 9-dram clear styrene tubes with snap-on caps, 1 x 2-3/4″ I.D. (25.2 x 68mm), are supplied as containers. Additional or replacement tubes #8909 are available.

As a safety precaution, BioQuip recommends using the #1135Y HEPA filter with this aspirator.

Also see #1135X aspirator syringe bulb. It allows users to aspirate specimens without inhaling particulate matter.";

$pat = "/#(\w+)/";
if ( preg_match_all( $pat, $str, $matches )) {
  $popped = array_pop( $matches );
  list( $alpha, $beta, $gamma ) = $popped;
  echo "The IDs are as follows:\n\n$alpha\n$beta\n$gamma\n";  
}


demo

此正则表达式指定一个主题标签,后跟括号以“记住”一个或多个单词字符,即数字或字母数据。通过用括号括起此表达式,将排除主题标签,并将剩余数据存储在$matches[1]中。一旦$ matches包含数据,您就完成了,除非您希望利用$matches[1]创建三个唯一变量并选择显示它们的值。

您可以免除使用正则表达式,并使用以下代码$str

<?php
$ids=[];
$a = explode("#",$str);
array_shift( $a );
$ids = array_map( function( $e ) {
                  return explode(" ",$e)[0];
                  },$a);

print_r($ids);

请参阅demo

通过避免使用preg_match_all(),第二种解决方案可以提供更好性能的优势。或者,您可以将explode()返回的数组拆分为仅包含相关信息的列表,然后为array_map()创建列表变量数组,如下所示:

<?php

$ids=[];
list(,$a,$b,$c) = explode( "#",$str );
$ids = array_map(function( $e ) {
                  return explode(" ",$e )[0];
                  },[ $a,$b,$c ]);

print_r( $ids );

请参阅demo

答案 2 :(得分:0)

如果没有正则表达式,您可以按空格分割字符串,并将以#开头的每个单词的子字符串添加到结果数组中。

foreach (explode(' ', $description) as $word) {
    if ($word[0] == '#') $products[] = substr($word, 1);
}

我认为可以安全地假设这比正则表达式慢。