我有一个存储在值中的文本,我只想在“eindformaat”之后获取文本。 这是文字:
$desc = 'Folder DIN A4 2-breuk altaarvouw
135g druk glanzend
4/4 kleurig (dubbelzijdige druk)
2-breuk altaarvouw
eindformaat: 29,7 cm x 41,9 cm
gevouwen eindformaat: 20,95 cm x 29,7 cm
gegevensformaat: 29,9 cm x 42,1 cm';
我想要的是“eindformaat”之后的值。所以这将是:29,7 cm x 41,9 cm在这种情况下。 我用preg_replace尝试了很多模式。但它们都不适合我。 我试过这个,但它不起作用:
preg_replace('/\/eindformaat\/.*/', '', $desc);
有人可以帮帮我吗?感谢。
答案 0 :(得分:3)
您不希望preg_replace
,而是preg_match
进行提取。然后只留下转义的\/
斜杠,因为文本中没有这些斜杠。
preg_match('/eindformaat:(.*)/', $desc, $result);
print $result[1];
parens中需要(.*)
,因此它会成为结果捕获组[1]
。另外.*
就足够了,因为如果没有正则表达式/s
标记,它就不会超出换行符。
正则表达式的实际优势在于你可以使它具有超级特异性:
preg_match('/eindformaat: ((\d+|,|cm|\s|x)+)/', $desc, $result);
正如@Jpsy指出的那样,如果你真的只想匹配第一个eindformaat:
而不是第二个匹配前一个词,那么添加一个^
锚点和{{1正则表达式标志,如:
/m
答案 1 :(得分:1)
您可以将字符串拆分为行,然后在:
上展开(如果存在),而不是正则表达式:
// Split lines
$lines = explode("\n", $desc);
foreach ($lines as $line) {
// Split the current line on :
$parts = explode(":", $line);
// If the : was present and we now have 2 segments
// Print the second segment if the first was eidnformaat with whitespace trimmed
if (isset($parts[1]) && $parts[0] == "eindformaat") {
echo trim($parts[1]);
}
}
答案 2 :(得分:1)
尝试:
$desc = preg_replace('/(\neindformaat:)[^\n]*/i', '$1', $desc);
这将删除'eindformaat:'之后的值(这似乎是你想要的) 否则,如果您想检索该值,则必须使用preg_match。
修改强>
这是一个更亮的版本:
$desc = preg_replace('/^(eindformaat:).*/im', '$1', $desc);
答案 3 :(得分:0)
这应该适合你:
preg_match('/eindformaat:([a-zA-Z0-9. ,]+)/g', $desc, $result);
您的匹配将存储在$ result中的数组中。
答案 4 :(得分:0)
你为什么不得到冒号的位置并采取一切正确的方法并通过trim()运行以失去领先的空间?
$line = 'gevouwen eindformaat: 20,95 cm x 29,7 cm';
$the_bit_that_want = trim( substr($line, substr($line, ':') ) );
答案 5 :(得分:0)
不确定如何使用正则表达式,但尝试使用strpos和substr来生成所需的结果。
$start_eindformaat = stripos($desc, 'eindformaat') + 13;
$length_eindformaat = stripos($start_eindformaat , 'gevouwen eindformaat') - $start_eindformaat;
$eindformaat = substr($desc, $start_eindformaat, $length_eindformaat