BBCode, preg_replace и именованные группы захвата - PullRequest
1 голос
/ 11 июня 2009

То, что я думал, будет простой реализацией двух строк кода и функции, которая, как оказалось, сделана неудачной.

На моей веб-странице я хочу, чтобы я мог набрать [text]1[/text], и он просто вытянет заголовок этого идентификатора.

function textFormat($text) {
    $raw = array(
        '\'\[text\](?P<id>.*?)\[/text\]\'is'
    );

    $out = array (
        '<a href="index.php?function=getData&reference=text&id=$1">' . getTextTitle() . '</a>'
    );

    preg_replace($raw, $out, $text);
    return $text;
}

function getTextTitle($id) {
     $sql = mysql_query("SELECT title FROM text WHERE id = $id");
     return mysql_result($sql);
}

Итак, вот небольшая прелестная проблема: как можно заметить, я вызываю функцию с числовой переменной, которая прекрасно работает в кавычках, но, как мы знаем, PHP это не нравится. Итак, я выбрал именованную группу. Использование $regs['id'] не работает.

Я что-то не так делаю?

Я поступаю неправильно?

1 Ответ

1 голос
/ 11 июня 2009

Ну, вы, конечно, делаете это совершенно по-другому, чем я когда-либо, но я думаю, что кое-что не слишком далеко от того, что вы пытаетесь, может сработать. Попробуйте это:

function textFormat($text) {
    $raw = array(
        '\'\[text\](?P<id>.*?)\[/text\]\'ise'
    );
    $out = array (
        '\'<a href="index.php?function=getData&reference=text&id=$1">\' . getTextTitle(\'$1\') . \'</a>\''
    );
    preg_replace($raw, $out, $text);
    return $text;
}

function getTextTitle($id) {
     $sql = mysql_query("SELECT title FROM text WHERE id = '" . mysql_real_escape_string($id) . "'");
     $res = mysql_result($sql);
     $row = mysql_fetch_array($res);
     return $row ? $row[0] : 'invalid ID';
}

Ваш оригинальный getTextTitle() будет, если, конечно, не произойдет что-то еще, я позволю кому-нибудь, между прочим, делать все, что ему нравится, с вашей базой данных посредством SQL-инъекции. Не за что.

Кроме того, я не знаю, что это за шум (?P<id> в регулярном выражении, поэтому я предполагаю, что он необходим по какой-то причине и оставляю его в покое. Я не знаю, правильно ли это.

...