【问题标题】:Print specific string from url from database从数据库中的 url 打印特定字符串
【发布时间】:2019-11-02 10:14:25
【问题描述】:

这是来自数据库“fishPrice/1572268723Career Portal.pdf”的示例 url 我只想打印文件名“Career Portal” 最好的方法是什么?

我尝试过使用preg_match,但出现“未定义的偏移错误”

$fishPrice['price'] 包含网址

<?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

【问题讨论】:

  • 取决于 url 的结构。它总是在正确名称之前有数字吗?您的印刷姓名是否也包含数字?
  • 不,我们不会在打印出来的名字上加上数字。

标签: php regex parsing preg-match


【解决方案1】:

只有一个样本字符串,模式准确性是推测性的。

我的最佳猜测是:(Demo)

$input = "fishPrice/1572268723Career Portal.pdf";
echo preg_match("~\d{10}\K[^.]+~", $input, $out) ? $out[0] : 'fail';

输出:

Career Portal

只匹配10位数字后的非点字符。

\K 的意思是:忘记之前匹配的字符或从这一点“保留”这些字符。这样就无需使用捕获组。


或者,您可以使用可能更可靠的非正则表达式技术。这里有两个:(Demo2)

echo ltrim(basename($input, '.pdf'), '0..9');
echo "\n---\n";
echo ltrim(pathinfo($input, PATHINFO_FILENAME), '0..9');

输出:

Career Portal
---
Career Portal

隔离文件名,然后左修剪所有数字。

【讨论】:

  • 哇,这看起来容易多了,谢谢,第一次看到一个名为 ltrim 的函数,也许我将来可以使用它。
  • @JohnMacasinag 请阅读:meta.stackexchange.com/a/5235/352329
【解决方案2】:

一种方法,将preg_match 与捕获组一起使用:

$input = "fishPrice/1572268723Career Portal.pdf";
preg_match("/.*\d{10}(.*)\.\w+$/", $input, $matches);
echo $matches[1];

这打印出Career Portal。这里的正则表达式逻辑是捕获最后 10 位数字序列之后但文件扩展名之前的所有内容。

【讨论】:

  • 谢谢蒂姆,您介意解释一下为什么我的代码之前没有工作吗,是我的正则表达式错误吗?
  • 您的正则表达式缺少分隔符,但更重要的是您的模式 [0-9] 只会匹配一个数字,这不是您想要的。
  • 谢谢我早些时候尝试解析它但决定使用 preg_match 因为它更适合我的需要但正则表达式字符令人困惑。
  • 您还有问题吗?
【解决方案3】:

好的,我为你做了一个小例子。

$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;

首先,我对 / 的子字符串应该始终如您所说。此后,我将削减数字,直到我得到一个有效的字符,这将是名称的开头。希望对您有所帮助!

【讨论】:

  • I want to print the file name only
  • 所以没有pdf?对我来说 .pdf 包含文件名。
  • 23 个函数调用?我不建议任何人接受这种低效的技术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多