【问题标题】:I want to search for my database instead of string with regex我想用正则表达式搜索我的数据库而不是字符串
【发布时间】:2015-04-21 09:05:12
【问题描述】:

我有这个代码来搜索主题标签,但这是一个字符串。

<?php
$test = '#1 en #2 als voorbeeld moeten niet werken maar #test, #l33t en #swag #420blazeit wel.';

if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) {
  foreach ($arrHashtags[2] as $strHashtag) {
    if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) {
      $test = str_replace($strHashtag, '<a href="http://twitter.com/'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test);
    }
  }
}

echo $test;
?>

但我想在从我的数据库中选择的文本中搜索主题标签。 例如echo "&lt;p&gt;".nl2br(htmlentities($row['tekst']))."&lt;/p&gt;";,在我放入数据库的文本中进行搜索。

<?php

include_once('connection.class.php');

class ShowOne {

    private $db;

    public function __construct() {
        $this->db = new Connection();
        $this->db = $this->db->databaseConnection();
    }


    public function showOneItem() {
        $query = $this->db->prepare('SELECT * FROM blog WHERE id=:itemid AND geblokkeerd=0');
        $query->bindValue(":itemid", $_GET["item"], PDO::PARAM_STR);
        if($query->execute()) {
            if($query->rowCount() > 0) {
                while($row = $query->fetch()) {
                    echo "<div class='blog'>";
                    echo "<h2>".htmlentities($row['titel'])."</h2>";

                    echo "<table class='showtable'>";

                    echo "<tr><td>Eigenaar blog: </td><td>".htmlentities($row['author'])."</td></tr>";
                    echo "<tr><td>Geplaatst op: </td><td>".htmlentities($row['geplaatstdate'])."</td></tr>";
                    echo "<tr><td>Laatst geupdate op: </td><td>".htmlentities($row['updatedate'])."</td></tr>";
                    echo "<tr><td>Trefwoorden: </td><td>".htmlentities($row['trefwoorden'])."</td></tr>";

                    echo "</table><br />";

                    if ( !empty( $row['afbeelding'] ) ) {
                        echo '<img src="uploadedafb/'.htmlentities($row['afbeelding']).'"<br /><br />';
                    }

                    echo "<p>".nl2br(htmlentities($row['tekst']))."</p>";   

                    echo "<p>".nl2br(htmlentities($row['tekst']))."</p>"; 

                    echo "<br /><p><a class='linkover' href='index.php'><i class='fa fa-long-arrow-left'></i>Terug naar volledig overzicht</a></p>";
                    if(isSet($_SESSION["userid"])) {
                        if($_SESSION["rank"] > 2) { 
                            echo '<a href="bewerken.php?id='.$row["id"].'"><i class="fa fa-pencil"></i> Bewerken</a>'; 
                        } else if($_SESSION['userid'] == $row['userid']) {
                            echo '<a href="bewerken.php?id='.$row["id"].'"><i class="fa fa-pencil"></i> Bewerken</a>'; 
                        }
                    }

                    /*if($row['userid'] == $_SESSION['userid'] || $_SESSION['rank'] > 1) {
                        echo "Verwijder Blog";
                    }*/

                    echo "</div>";
                }
            } else {
                echo "<div class='error'><h3>Let op</h3>Er is geen blog gevonden.</div>";   
            }
        } else {
            echo "<div class='error'><h3>Let op</h3>Er is iets fout gegaan met het ophalen van de blog.</div>";
        }
    }

}

?>

【问题讨论】:

  • 我对你的first code block 没意见,这很清楚,但是2nd block 呢?我很痛苦,看看你想要什么?这是您尝试执行的代码但它不起作用吗?你能更清楚你想要什么(也许有例子)。也许您在2nd block 中的所有文本都是德语(对吗?)这一事实让人难以理解,也许您可​​以翻译一下? (特别是数组键和echos)
  • 基本上我想在我的博客中搜索主题标签,它适用于字符串。但是博客文本不是我的 SQL 数据库中的字符串。我不知道如何使用该文本搜索主题标签。
  • 我不明白你提到的区别......当你从数据库中获取数据时,它是一个字符串(特别是在没有类型的 PHP 中)。如果你没有得到一个字符串,你会得到一个包含(在一定深度)你想要的字符串的数组。您使用 $row 作为数组,每列作为键。您要解析的字段是什么?它不是在您的数据库的列中吗?
  • 它是我数据库中的一个列,例如,仍然给我关于 undefiend 变量 $test 的问题。不知道如何定义它们。
  • 如果它在tekst 列中,您希望的字符串必须在您的$row['tekst'] 中。这不是你想要的吗?你的echo "&lt;p&gt;".nl2br(htmlentities($row['tekst']))."&lt;/p&gt;"; 上打印了什么?你没有得到你想要解析的字符串吗?

标签: php sql regex


【解决方案1】:

如果我明白你想要什么,你应该这样做:

假设测试的文本是:'#1 en #2 als voorbeeld moeten niet werken maar #test, #l33t en #swag #420blazeit wel.'

替换你的echo "&lt;p&gt;".nl2br(htmlentities($row['tekst']))."&lt;/p&gt;"; 与:

$test = $row['tekst'];
if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) {
  foreach ($arrHashtags[2] as $strHashtag) {
    if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) {
      $test = str_replace($strHashtag, '<a href="http://twitter.com/'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test);
    }
  }
}

编辑:删除 htmlentities

echo "<p>".nl2br($test)."</p>";

【讨论】:

【解决方案2】:

尝试使用explode和implode这样的东西,因为我不擅长正则表达式:

<?php 

 $test1="";
    $test= '#1 en #2 als voorbeeld moeten niet werken maar #test, #l33t en #swag #420blazeit wel.';// this string is for example you need to use $row['tekst'] instead of this
//$test = $row['tekst']; //un-comment it for your use
    $arrHashtags=explode('#',$test);
        foreach ($arrHashtags as $strHashtag) {
            if(isset($strHashtag) && strlen($strHashtag) > 0){
            $arrHas=explode(' ',$strHashtag);
            $zero=$arrHas[0];
            unset($arrHas[0]);
                $test1.= '<a href="http://twitter.com/'.$zero.'">'.implode(' ',$arrHas).'</a>';
            }
        }

    echo "<p>".nl2br(htmlentities($test1))."</p>";

    ?>

【讨论】:

  • 唯一的区别(这可能是问题,也可能不是问题)是正则表达式在# 之后定义了接受的字符,您的方法接受每个字符直到下一个空格。正则表达式只接受[a-z]_,所以不接受CAPS,也不接受-。我看不到用explode / implode方法做这些事情的方法......你呢?
  • @Random 否,但您仍然可以使用字符串来识别某些字符并避免它们,但这不是一个好主意。我在这里所做的是,通过一些特定假设以最简单的方式获得解决方案。使用正则表达式是一种很好的做法。
  • 是的,我同意,正则表达式是贪婪的,必须尽可能避免它们
猜你喜欢
  • 2011-03-17
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多