PHP – заменить текст и проверить файл?

У меня есть эта простая строка php

$text  = preg_replace("/\\ii(.*?)\\<>/", "<img scr='img/$1'>", $text);

Где я меняю II30.jpgII на <img scr='img/30.jpg'>, и все работает нормально.

Но что мне нужно, так это проверить, существует ли файл с именем 30.txt, и если да, то напечатать текст под изображением. Я просто не могу понять, как это сделать - может быть, я все равно неправильно использую preg_replace?

Что мне действительно нужно, так это способ изменить \<img>30.jpg\<img> на <img scr='img/30.jpg'>, но я не мог понять, как искать \<img>, поэтому вместо этого я использовал II :-)

А затем вызовите функцию image_text_print("img/30.txt"), если файл существует, вставьте возврат чуть ниже изображения.

Это не очень хорошо объяснено, но я надеюсь, вы понимаете, что я ищу :-)


Редактировать

Вместо этого, возможно, мне следует как-то поискать в $text xxxxxx, а затем

  • проверьте файл xxxxxx.txt
  • прочитайте файл xxxxx.txt
  • внесите изменения в $text в

  • (текст из файла xxxx.txt)

Но я не могу понять, как искать контент между несколькими и в $text :-/

Йоргенсен

🤔 А знаете ли вы, что...
С PHP можно работать с файлами и директориями на сервере.


50
1

Ответ:

Решено

Это мое предлагаемое решение, использующее preg_match_all вместо preg_replace или preg_replace_callback. Я сделал несколько предположений: 1) изображения всегда представляют собой цифры, за которыми следует точка jpg, и 2) между изображениями может быть другой текст. Я уверен, что вы можете настроить их по мере необходимости.

//sample text to search and replace on
$text = 'Some other text \<img>30.jpg\<img> something in between \<img>50.jpg\<img> something else \<img>40.jpg\<img>';

//initialize an array to hold the matches
$matches = [];

//this is here to mock up the function you said you needed to call
//this code simply fetches the file contents
function image_text_print($filename)
{
  return file_get_contents($filename);
}

//find all matches of \<img>30.jpg\<img> where 30 can be any number made up of 1 or more digits (adjust the regex to your requirements)
if (preg_match_all('#\\\<img>(\d+).jpg\\\<img>#', $text,$matches))
{
  //preg_match_all gives us 2 arrays, one with the matched text and one with the image numbers
  foreach($matches[0] as $matchInd=>$matchText)
  {
    //build up the replacement text
    $replacement = '<img scr = "img/'.$matches[1][$matchInd].'.jpg">';
    
    //create the filename and then check if it exists
    $filename = 'img/'.$matches[1][$matchInd].'.txt';
    if (is_file($filename))
    {
      //if the file exists call your function and append results
      $replacement .= image_text_print($filename);
    }

    //finally replace the matched text
    $text = str_replace($matchText,$replacement,$text);
  }
}