从数据库中打印 url 中的特定字符串
Print specific string from url from database
这是来自数据库的示例 url "fishPrice/1572268723Career Portal.pdf" 我只想打印文件名 "Career Portal" 最好的方法是什么?
我试过使用 preg_match
但我得到 "undefined offset error"
$fishPrice['price']
包含 url
<?php
if(!empty($fishPrices))
{
foreach ($fishPrices as $fishPrice)
{
$date = strtotime($fishPrice['Date']);
$url = $fishPrice['price'];
$pattern = "[0-9]/";
preg_match('[0-9]', $url, $matches);
$price = $matches[1];
?>
<div class="">
<div class="col-lg-6 col-lg-offset-0 col-md-8 col-md-offset-2 col-sm-12">
<div class="container-outer">
<div class="container-inner ">
<div class="images-left">
<img src="http://via.placeholder.com/270x270" alt="girl-heart">
</div>
<div class="text-cont-right">
<div class="images-text">
<h3><a href="features-ecology.html"><?= date('M j Y', $date)?></a></h3>
<p><?= $price ?></p>
</div>
<div class="buttons">
<a href="admin/<?=$fishPrice['price']?>" class="green-btn green-btn-news">Read More</a>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
一种方法,使用 preg_match
和捕获组:
$input = "fishPrice/1572268723Career Portal.pdf";
preg_match("/.*\d{10}(.*)\.\w+$/", $input, $matches);
echo $matches[1];
这会打印 Career Portal
。这里的正则表达式逻辑是捕获最后 10 位数字序列之后但文件扩展名之前的所有内容。
好的,我为你做了一个小例子。
$string = "fishPrice/1572268723Career Portal.pdf";
//Echo 1572268723Career Portal.pdf
$string = substr($string, strpos($string, "/")+1);
while(is_numeric($string[0]))
{
$string = substr($string, 1);
}
//Career Portal.pdf
echo $string;
首先,我的 / 子串应该像你说的那样一直存在。此后我将削减数字直到我得到一个有效字符,这将是名称的开头。希望对您有所帮助!
只有一个示例字符串,模式准确性是推测性的。
我的最佳猜测是:(Demo)
$input = "fishPrice/1572268723Career Portal.pdf";
echo preg_match("~\d{10}\K[^.]+~", $input, $out) ? $out[0] : 'fail';
输出:
Career Portal
只匹配10位后的非点字符。
\K
表示:忘记之前匹配的字符或"keep"从这一点开始的字符。这样就无需使用捕获组。
或者,您可以使用可能更可靠的非正则表达式技术。这里有两个:(Demo2)
echo ltrim(basename($input, '.pdf'), '0..9');
echo "\n---\n";
echo ltrim(pathinfo($input, PATHINFO_FILENAME), '0..9');
输出:
Career Portal
---
Career Portal
隔离文件名,然后留下 trim 所有数字。
这是来自数据库的示例 url "fishPrice/1572268723Career Portal.pdf" 我只想打印文件名 "Career Portal" 最好的方法是什么?
我试过使用 preg_match
但我得到 "undefined offset error"
$fishPrice['price']
包含 url
<?php
if(!empty($fishPrices))
{
foreach ($fishPrices as $fishPrice)
{
$date = strtotime($fishPrice['Date']);
$url = $fishPrice['price'];
$pattern = "[0-9]/";
preg_match('[0-9]', $url, $matches);
$price = $matches[1];
?>
<div class="">
<div class="col-lg-6 col-lg-offset-0 col-md-8 col-md-offset-2 col-sm-12">
<div class="container-outer">
<div class="container-inner ">
<div class="images-left">
<img src="http://via.placeholder.com/270x270" alt="girl-heart">
</div>
<div class="text-cont-right">
<div class="images-text">
<h3><a href="features-ecology.html"><?= date('M j Y', $date)?></a></h3>
<p><?= $price ?></p>
</div>
<div class="buttons">
<a href="admin/<?=$fishPrice['price']?>" class="green-btn green-btn-news">Read More</a>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
一种方法,使用 preg_match
和捕获组:
$input = "fishPrice/1572268723Career Portal.pdf";
preg_match("/.*\d{10}(.*)\.\w+$/", $input, $matches);
echo $matches[1];
这会打印 Career Portal
。这里的正则表达式逻辑是捕获最后 10 位数字序列之后但文件扩展名之前的所有内容。
好的,我为你做了一个小例子。
$string = "fishPrice/1572268723Career Portal.pdf";
//Echo 1572268723Career Portal.pdf
$string = substr($string, strpos($string, "/")+1);
while(is_numeric($string[0]))
{
$string = substr($string, 1);
}
//Career Portal.pdf
echo $string;
首先,我的 / 子串应该像你说的那样一直存在。此后我将削减数字直到我得到一个有效字符,这将是名称的开头。希望对您有所帮助!
只有一个示例字符串,模式准确性是推测性的。
我的最佳猜测是:(Demo)
$input = "fishPrice/1572268723Career Portal.pdf";
echo preg_match("~\d{10}\K[^.]+~", $input, $out) ? $out[0] : 'fail';
输出:
Career Portal
只匹配10位后的非点字符。
\K
表示:忘记之前匹配的字符或"keep"从这一点开始的字符。这样就无需使用捕获组。
或者,您可以使用可能更可靠的非正则表达式技术。这里有两个:(Demo2)
echo ltrim(basename($input, '.pdf'), '0..9');
echo "\n---\n";
echo ltrim(pathinfo($input, PATHINFO_FILENAME), '0..9');
输出:
Career Portal
---
Career Portal
隔离文件名,然后留下 trim 所有数字。