функция, которая очищает значения, переданные через $ _POST, перед отправкой

#php #function #preg-replace

#php #функция #preg-replace

Вопрос:

Я пишу функцию, которая берет содержимое $_POST , вставляет его в строку, а затем возвращает результирующую строку

На вопрос «Какой ваш любимый цвет?» пользователь вводит blue на вопрос «Какое ваше любимое животное?» пользовательские вводы dog

 $content = "The visitor's favorite color is {color}";
$content = sentenceBuilder($content);

$content = "The visitor's favorite animal is a {animal}";
$content = sentenceBuilder($content);

function sentenceBuilder($content){
   global $_POST;
    foreach($_POST as $key => $value){
     if($key=='color'){
      $content = preg_replace("/{($key )}/", $value, $content);
     }
     if($key=='animal'){
      $content = preg_replace("/{($key )}/", $value, $content);
     }
    }
   return $content;
}
 

Это возвращает «Любимый цвет посетителя — синий» и «Любимое животное посетителя — собака». Если они оставляют элемент color пустым, он возвращает «Любимый цвет посетителя » и «Любимое животное посетителя — собака». Если они оставляют оба элемента пустыми, возвращается 2 неполных предложения.

Итак, я попытался изменить его, чтобы сказать, что если $value оно пустое, функция просто пропустит его и перейдет к следующему (так как при этом используется каждый элемент формы, который переместился в $ _POST)…

 if($key=='color' amp;amp; $value!=''){
  $content = preg_replace("/{($key )}/", $value, $content);
}else{
  $content ='';
}
if($key=='animal' amp;amp; $value!=''){
  $content = preg_replace("/{($key )}/", $value, $content);
}else{
  $content ='';
}
 

С добавлением этого результат, который я получаю, является пустым. Никаких предложений или чего-либо еще. Даже если они заполняют элементы, результат все равно остается пустым с добавлением этого кода.

Поэтому я попробовал это вместо этого.

 function sentenceBuilder($content){
   global $_POST;
    foreach($_POST as $key => $value){
     if(isset($value) amp;amp; $value!=''){
       if($key=='color'){
        $content = preg_replace("/{($key )}/", $value, $content);
       }
       if($key=='animal'){
        $content = preg_replace("/{($key )}/", $value, $content);
       }
     else{
      $content = '';
     }
    }
   return $content;
}
 

Это дало те же результаты.

TLDR;

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

Обновить

Я заставил код работать. Однако пришлось переделать его, чтобы это произошло.

 <?php 

if(isset($_POST)){
$content = "The visitor's favorite color is {color}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor's favorite animal is a {animal} from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from Iowa";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {state}";
echo sentenceBuilder($content);
}

function sentenceBuilder($content){
     preg_match("/{(.*?)}/", $content, $checkbrackets);
     if(!empty($checkbrackets)){
         $gettext = str_replace('{', '', $checkbrackets[0]);
         $gettext = str_replace('}', '', $gettext);

         if(array_key_exists($gettext,$_POST)){
             if(!empty($_POST[$gettext])){
                $content = preg_replace("/{($gettext )}/", $_POST[$gettext], $content);
             }else{
                $content = ''; 
             }
         }
     }
   return $content;
}   

?>


<form method="post" action"sentencebuilder.php">
<input type="text" name="color" />
<input type="text" name="animal" />
<input type="text" name="land" />
<input type="submit" />
</form>
 

Спасибо за помощь, ребята. Введите его, и вы увидите, к чему я стремился. В настоящее время я работаю над этим, чтобы изменить дополнительные скобки, которые существуют в вопросе.

Комментарии:

1. Не существует «одной функции» для «очистки» ввода. «очистка» зависит от контекста. Очистка строки с помощью специфичной для SQL функции совершенно бессмысленна, если строка будет использоваться в контексте HTML. И совет: $ _POST и его родственники являются суперглобальными. Они доступны во всех областях. global $_POST бесполезно / избыточно.

2. Спасибо за совет. Я понимаю, что очистка зависит от контекста … это то, что я написал для этой функции … на основе контекста. Он очищает содержимое для меня. Я не просил функцию для очистки содержимого, но почему эта функция, которую я написал, не будет обрабатывать пустые значения, отличные от запрошенных.

3. Кроме того, зачем цикл foreach? Зачем перебирать весь массив post и проверять каждый ключ на наличие определенного ключа? if (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) { ... } было бы намного эффективнее.

4. цикл foreach существует, потому что он обрабатывает все, что передается через $ _POST … этот фрагмент, который я дал, — это всего лишь одна крошечная часть, чтобы попытаться разобраться в вещах для людей, которые могут быть в состоянии помочь. Можете ли вы ответить, почему информация не отображается в соответствии с запросом в исходном сообщении?

5. Вы получаете пробел, когда присутствует цвет?


Ответ №1:

Используйте этот код, определенно, это решение вашей проблемы:-

 <?php
    $main_content = array();
    if(isset($_POST['submit'])) {
     unset($_POST['submit']);
      $main_content['color'] = "The visitor's favorite color is {color}";
      $main_content['dog'] = "The visitor's favorite dog is {dog}";
      $main_content['school'] = "The visitor's favorite school is {school}"; 
      $formData = array_filter($_POST);
      if(!empty($formData)) {
        echo sentenceBuilder($formData, $main_content);
      }
    } 

    function sentenceBuilder($formData=null, $main_content=null){
            $newContent = "";
        foreach ($formData as $key => $value) {
            $newVal = "";   
            $newVal = preg_replace("/{($key )}/", $value, $main_content[$key]);
            $newContent .= $newVal.". <br/>";   
        }

        return $newContent;
      }
    ?>


    <form method="post" action="#">
    <input type="text" name="color" placeholder="color" />
    <input type="text" name="dog" placeholder="dog" />
    <input type="text" name="school" placeholder="school" />
    <input type="submit" name="submit" />

**OUTPUT:**

    The visitor's favorite color is RED. 
    The visitor's favorite dog is BULLDOG. 
    The visitor's favorite school is CAMPUS SCHOOL. 
 

Комментарии:

1. Оставляя одно поле пустым, возвращает это. Любимый цвет посетителя — {color} Любимое животное посетителя — собака. Я ценю помощь, но это обходит только те, у которых отсутствуют значения. Это только половина проблемы. Цель состоит в том, чтобы вообще не отображать предложение, если ввод был оставлен пустым.

2. Хорошо, вы отредактировали вопрос. 🙂 Позвольте мне перепостить ответ. У меня есть простое решение вашей проблемы.

3. Любимый цвет посетителя — синий. Любимая собака посетителя …. Любимая школа посетителя — лакота. Я оставил dog пустым. Это результат. вот что я хотел бы видеть, когда я оставляю dog one пустым. Любимый цвет посетителя — синий. Любимая школа посетителей — лакота.

4. Можете ли вы написать вывод, чего на самом деле вы хотите:- 1) Любимый цвет посетителя — синий. Любимая собака посетителя … Любимое животное посетителя — собака. —- ИЛИ — 2) Любимый цвет посетителя — синий. Любимое животное посетителя — собака. КАКОЙ ИЗ НИХ ВАМ НУЖЕН?

5. Хорошо, теперь я тебя понял. Я снова редактирую ответ. Пожалуйста, проверьте. И не забудьте проголосовать, если правильно.

Ответ №2:

Надеюсь, это поможет вам

 <?php
$content = '';
echo $content = sentenceBuilder($content);

function sentenceBuilder($content){
   global $_POST;
   $content = "The visitor's favorite color is {key}";
    foreach($_POST as $key => $value){
     if (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) {
      $content = preg_replace("/{(key )}/", $value, $content);
     }
    }
   if(strpos($content, '{key}') !== false)
     return $content='';
   else
     return $content;
}?>

<form method="post">
<input type="text" name="color" />
<input type="text" name="gh" />
<input type="submit" />
</form>
 

Если вы хотите сначала color проверить, попробуйте

 if (isset($_POST['color']) amp;amp; ($_POST['color'] != '')) {
   $content = preg_replace("/{(key )}/", $value, $content);
}
elseif (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) {
   $content = preg_replace("/{(key )}/", $value, $content);
}
 

Комментарии:

1. С этим мне тоже не повезло.

Ответ №3:

Я понимаю, что вам действительно нужна функция, а не просто «встроенный» код. В этом случае эта функция сделает свое дело (если я правильно понимаю ваши пожелания).

В комментариях к коду вы найдете некоторые рекомендации.

Надеюсь, это поможет 🙂

 function sentenceBuilder($content = '')
{
    preg_match_all('/{(.*?)}/', $content, $matches); // Find all {...} matches
    $valueMissing = false; // If a POST value is missing, this will be set to TRUE

    if(isset($matches[0]) amp;amp; !empty($matches[0])) { // Braces are found
        foreach($matches[0] as $id => $match) {
            // Note the usage of $matches[0] vs $matches[1]: $matches[0] = '{animal}','{land}',  while $matches[1] = 'animal','land' without the braces
            $key = (isset($matches[1][$id]) ? $matches[1][$id] : false); // Quick if/else
            $postValue = ($key != false ? (isset($_POST[$key]) ? $_POST[$key] : false) : false); // Quick if/else (double)
            if($postValue == false) {
                $valueMissing = true;
                break; // Leave the foreach loop
            } else {
                $content = str_replace($match, $postValue, $content); // Replace the value
            }
        }
        if($valueMissing) {
            return ''; // Return empty string (braces found, but not all values were found in the POST)
        }
    }
    return $content; // Return the content
}
 

——— ИСХОДНОЕ СООБЩЕНИЕ ———

Предварительная замена кажется немного излишней для этого, isset() и empty() сделают свое дело.

 <?php
if(isset($_POST) amp;amp; !empty($_POST))
{
  // Start with empty content
  $content = '';

  // Only add content (.=) when the field is set (posted) and NOT empty
  if(isset($_POST['color']) amp;amp; !empty($_POST['color'])) {
    $content .= "The visitor's favorite color is " .$_POST['color']. "<br/>";
  }
  if(isset($_POST['animal']) amp;amp; isset($_POST['land']) amp;amp; !empty($_POST['animal']) amp;amp; !empty($_POST['land'])) {
    $content .= "The visitor's favorite animal is a " .$_POST['animal']. " from " .$_POST['land']. "<br/>";
  }
  if(isset($_POST['state']) amp;amp; !empty($_POST['state'])) {
    $content .= "The visitor is from " .$_POST['state']. "<br/>";
  }
  if(isset($_POST['number']) amp;amp; !empty($_POST['number'])) {
    $content .= "The visitor's favorite number is " .$_POST['number']. "<br/>";
  }

  // If there is some content, show it
  if(!empty($content))
  {
    echo $content;
  }
  else
  {
    echo "Please fill in some values!";
  }
}
else
{
  ?>

<form method="post" action"<?php echo $_SERVER['PHP_SELF']; ?>">
  Favorite color: <input type="text" name="color" /><br />
  Favorite animal: <input type="text" name="animal" /><br />
  from land: <input type="text" name="land" /><br />
  <br />
  Favorite number: <select name="number">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
  </select>
  <input type="submit" value="SEND this form" />
</form>

<?php }
 

И вы можете использовать HTMLPurifier (например) для «фильтрации» любых вводимых пользователем данных. http://htmlpurifier.org /

Комментарии:

1. То, что вы опубликовали, хотя и полезно для передачи переменных при отправке, не будет полезно для функции, которую я пишу. Preg replace — это именно то, что нужно функции для выполнения ее задачи. Код, который я опубликовал, чтобы получить помощь, был лишь незначительным примером проблемы, с которой я столкнулся. Тем не менее, спасибо за ваш ответ. Я ценю любой вклад, который может быть полезным!

Ответ №4:

Это работает.

 <?php 

if(isset($_POST)){
$content = "The visitor's favorite color is {color}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor's favorite animal is a {animal} from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from Iowa";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {state}";
echo sentenceBuilder($content);
}

function sentenceBuilder($content){
 preg_match("/{(.*?)}/", $content, $checkbrackets);
 if(!empty($checkbrackets)){
     $gettext = str_replace('{', '', $checkbrackets[0]);
     $gettext = str_replace('}', '', $gettext);

     if(array_key_exists($gettext,$_POST)){
         if(!empty($_POST[$gettext])){
            $content = preg_replace("/{($gettext )}/", $_POST[$gettext], $content);
         }else{
            $content = ''; 
         }
     }
 }
return $content;
}   

?>


<form method="post" action"sentencebuilder.php">
<input type="text" name="color" />
<input type="text" name="animal" />
<input type="text" name="land" />
<input type="submit" />
</form>