如何将以下描述中提到的每个产品标识号变为变量,不包括#从PHP中的描述中提取它们?
两个9-dram透明苯乙烯管,带有卡扣帽,1 x 2-3 / 4“I.D。 (25.2 x 68毫米),作为容器提供。附加或替换 管#8909 可用。
作为安全预防措施,BioQuip建议使用#1135Y HEPA 用这个吸气器过滤。
另见#1135X 吸气器注射器灯泡。它允许用户吸气 标本没有吸入颗粒物。
答案 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>';
}
?>
这将输出:
答案 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);
}
我认为可以安全地假设这比正则表达式慢。