php заменить подстроку на регулярное выражение - PullRequest
1 голос
/ 13 марта 2012

Хорошо, я знаю, что есть триллионы подобных вопросов, но мне действительно трудно этого добиться. У меня есть несколько строк этого формата:

$x = '<iframe src="[File:19]"></iframe>';
$y = '<img src=[File:2212] />';
$z = '<source src="[File:42]" />';

Я пытаюсь получить идентификатор, указанный после File:, а также заменить целое [File:xxx] другой строкой. Я пытаюсь сделать следующее, но, похоже, я не могу полностью понять, как использовать preg_replace.

$file = ('<iframe src="[File:134]"></frame>');
$rex = "/^.*(\[File:[0-9]{1,}\])/i" ;
if ( preg_match($rex, $file, $match) ) {
    echo 'OK';
}
$file = preg_replace ($rex, "http://lala.com/la.pdf", $file);
echo "<br>".htmlentities($file)."<br>";

Не могли бы вы дать мне несколько советов, как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Это должно сработать:

preg_match('/\[File:(\d+)\]/i', $str, $match)

$ match [0] будет содержать всю строку, $ match [1] будет содержать только число.
После соответствия регулярному выражению вы можете использовать str_replace, чтобы удалить $ match [0] из строки.

Пример:

$x = '<iframe src="[File:19]"></iframe>';
preg_match('/\[File:(\d+)\]/i', $x, $match);
var_dump($match);

Дает:

array(2) {
  [0]=>
  string(9) "[File:19]"
  [1]=>
  string(2) "19"
}
1 голос
/ 13 марта 2012

Это должно работать:

<?php
$formats[] = '<iframe src="[File:19]"></iframe>';
$formats[] = '<img src=[File:2212] />';
$formats[] = '<source src="[File:42]" />';


foreach( $formats as $format ) {

    $regex = '~\[File:(\d+)\]~';

    $replace = function( $matches ) {
        return 'http://lala.com/la.pdf?id=' . $matches[1];
    };

    var_dump( preg_replace_callback( $regex, $replace, $format ) );
}

Я создал лямбду для замены, потому что я чувствую, что вы хотите использовать идентификатор после File: вместо того, чтобы просто отказаться от него.Веселитесь с этим.Если у вас есть какие-либо вопросы, скажите.

1 голос
/ 13 марта 2012

Измените эти 2 строки

$rex = "/^.*(\[File:[0-9]{1,}\])/i" ;

$file = preg_replace ($rex, "http://lala.com/la.pdf", $file);

на:

$rex = "/^(.*)\[File:[0-9]{1,}\]/i" ;

$file = preg_replace ($rex, "$1http://lala.com/la.pdf", $file);

Это захватит то, что было до [File...], в группу 1, затем в части замены добавьте эту группу (т.е. $1) перед строкой замены.

Может быть переписан как:

$rex = "/\[File:\d+\]/i" ;

$file = preg_replace ($rex, "http://lala.com/la.pdf", $file);
...