【问题标题】:PHP separate string by specific array of wordsPHP通过特定的单词数组分隔字符串
【发布时间】:2017-06-19 12:40:50
【问题描述】:

我在 php 中有以下值的数组

Array
(
    [0] => Clarithromycin 250mg/5ml oral susptake TWO 5ml spoonsful TWICE each day DISCARD REMAINING AFTER TEN DAYSSHAKE THE BOTTLE WELL BEFORE USING.SPACE THE DOSES EVENLY. KEEP TAKING UNTIL THE COURSE IS FINISHED, UNLESS YOU ARE TOLD TO STOP.
    [1] => Lactulose 3.1-3.7g/5ml oral solntake ONE to FOUR 5ml spoonsful TWICE each day when required (PRN : to be taken when necessary)
    [2] => Mirtazapine orodisp 30mg tabsOne To Be Taken At NightALLOW THE TABLETS TO DISSOLVE ON YOUR TONGUE, THEN SWALLOW WITH THE SALIVA. TAKE AFTER FOOD.WARNING: THIS MEDICINE MAY MAKE YOU FEEL SLEEPY. IF THIS HAPPENS, DO NOT DRIVE OR USE TOOLS OR MACHINES. DO NOT DRINK ALCOHOL.
    [3] => Senna 7.5mg/5ml oral soln SFTwo 5ml Spoonfuls To Be Taken At NightSHAKE THE BOTTLE WELL BEFORE USING.THIS MEDICINE MAY COLOUR YOUR URINE. THIS IS HARMLESS.
    [4] => SUDOCREM ANTISEPTIC HEALING CREAMas directedFOR EXTERNAL USE ONLY. (MD mean As directed)
    [5] => CIRCADIN MR 2MG TABSOne To Be Taken At NightSWALLOW WHOLE. DO NOT CHEW OR CRUSH.TAKE WITH OR JUST AFTER FOOD, OR A MEAL.WARNING: THIS MEDICINE MAY MAKE YOU FEEL SLEEPY. IF THIS HAPPENS, DO NOT DRIVE OR USE TOOLS OR MACHINES. DO NOT DRINK ALCOHOL.
    [6] => Memantine 10mg tabsOne To Be Taken Each Day
    [7] => Omeprazole gr 10mg capsOne To Be Taken Each DaySWALLOW WHOLE.DO NOT CHEW OR CRUSH.
    [8] => Senna 7.5mg tabsTwo To Be Taken At NightTHIS MEDICINE MAY COLOUR YOUR URINE. THIS IS HARMLESS.
)

我想用特定的词将药物和描述分开。例如(带两个,一个要带,一个要带,要带等.....)

array
(
    [0] => Array
        (
            [medicine] => Clarithromycin 250mg/5ml oral susp
            [description] => take TWO 5ml spoonsful TWICE each day DISCARD REMAINING AFTER TEN DAYSSHAKE THE BOTTLE WELL BEFORE USING.SPACE THE DOSES EVENLY. KEEP TAKING UNTIL THE COURSE IS FINISHED, UNLESS YOU ARE TOLD TO STOP.
        )

    [1] => Array
        (
            [medicine] => Lactulose 3.1-3.7g/5ml oral soln
            [description] =>take ONE to FOUR 5ml spoonsful TWICE each day when required (PRN : to be taken when necessary)
        )

    [2] => Array
        (
            [medicine] => Mirtazapine orodisp 30mg tabs
            [description] => One To Be Taken At NightALLOW THE TABLETS TO DISSOLVE ON YOUR TONGUE, THEN SWALLOW WITH THE SALIVA. TAKE AFTER FOOD.WARNING: THIS MEDICINE MAY MAKE YOU FEEL SLEEPY. IF THIS HAPPENS, DO NOT DRIVE OR USE TOOLS OR MACHINES. DO NOT DRINK ALCOHOL.
        )
.
.
.
.
)

【问题讨论】:

  • Stack Overflow 您应该尝试自己编写代码。在 doing more research 之后,如果您有问题,您可以发布您尝试过的内容,并清楚地解释什么不起作用并提供Minimal, Complete, and Verifiable example。我建议阅读How to Ask 一个好问题和the perfect question。另外,请务必使用tour 并阅读this
  • 你从哪里抓取数据?也许你可以对源添加更多检查。
  • 我们列出了有问题的关键字列表,例如(取两个,一个要采取,一个要采取,一个要采取等.....)如果在字符串中找到任何单词将其拆分。
  • 句子“take one. more words. one to be take with food”会分裂成什么?
  • 如果有人需要,也可以here's a sandbox boilerplate

标签: php


【解决方案1】:

试试这个:

foreach ($array as $key => $value) {
    $explode = explode('separate', $value);
    $array[$key] = array(
        'medicine' => $explode[0],
        'description' => $explode[1]
    );
}

只需按您要分隔文本的单词编辑“分隔”

【讨论】:

    【解决方案2】:
    //Main array
    //Create array of words that you have to separate from
    $arrOfsplittedData = [];
    $intCount = 0;
    foreach($arrOfMedicineAndDesc as $medicineAndDesc){
        $lowerCaseMedicineAndDesc = strtolower($medicineAndDesc);
        $splitMedicineAndDesc = multiexplode(array("oral", "tabsone", "cream", "capsone", "tabstwo"), $lowerCaseMedicineAndDesc);
        if($splitMedicineAndDesc){
            $arrOfsplittedData[$intCount]["medicine"] =          $splitMedicineAndDesc[0];
            $arrOfsplittedData[$intCount]["description"] = $splitMedicineAndDesc[1];
        }
        $intCount++;
    }
    
    function multiexplode ($delimiters,$string) {    
        $ready = str_replace($delimiters, $delimiters[0], $string);
        $launch = explode($delimiters[0], $ready);
        return  $launch;
    }
    echo "<pre>";
    print_r($arrOfsplittedData);die;
    

    【讨论】:

      【解决方案3】:

      你可以巧妙地使用正则表达式来做到这一点:

      <?php
      $array = array(
          "Clarithromycin 250mg/5ml oral susptake TWO 5ml spoonsful TWICE each day DISCARD REMAINING AFTER TEN DAYSSHAKE THE BOTTLE WELL BEFORE USING.SPACE THE DOSES EVENLY. KEEP TAKING UNTIL THE COURSE IS FINISHED, UNLESS YOU ARE TOLD TO STOP.",
          "Lactulose 3.1-3.7g/5ml oral solntake ONE to FOUR 5ml spoonsful TWICE each day when required (PRN : to be taken when necessary)",
          "Mirtazapine orodisp 30mg tabsOne To Be Taken At NightALLOW THE TABLETS TO DISSOLVE ON YOUR TONGUE, THEN SWALLOW WITH THE SALIVA. TAKE AFTER FOOD.WARNING: THIS MEDICINE MAY MAKE YOU FEEL SLEEPY. IF THIS HAPPENS, DO NOT DRIVE OR USE TOOLS OR MACHINES. DO NOT DRINK ALCOHOL.",
          "Senna 7.5mg/5ml oral soln SFTwo 5ml Spoonfuls To Be Taken At NightSHAKE THE BOTTLE WELL BEFORE USING.THIS MEDICINE MAY COLOUR YOUR URINE. THIS IS HARMLESS.",
          "SUDOCREM ANTISEPTIC HEALING CREAMas directedFOR EXTERNAL USE ONLY. (MD mean As directed)",
          "CIRCADIN MR 2MG TABSOne To Be Taken At NightSWALLOW WHOLE. DO NOT CHEW OR CRUSH.TAKE WITH OR JUST AFTER FOOD, OR A MEAL.WARNING: THIS MEDICINE MAY MAKE YOU FEEL SLEEPY. IF THIS HAPPENS, DO NOT DRIVE OR USE TOOLS OR MACHINES. DO NOT DRINK ALCOHOL.",
          "Memantine 10mg tabsOne To Be Taken Each Day",
          "Omeprazole gr 10mg capsOne To Be Taken Each DaySWALLOW WHOLE.DO NOT CHEW OR CRUSH.",
          "Senna 7.5mg tabsTwo To Be Taken At NightTHIS MEDICINE MAY COLOUR YOUR URINE. THIS IS HARMLESS."
      );
      
      $splitWords = [
          "take \w+?\b",
          "to be taken"
      ]; //Regex of what you want to split on
      
      $regex = "/(".implode("|",$splitWords).")/";
      
      
      
      $replaced = preg_replace($regex, "\n$1", $array); //Replace what you found with a newline + what you found
      
      print_r(array_map(function ($v) { 
          $array = explode("\n",$v); 
          return [ 
              "medicine" => $array[0], 
              "description" => isset($array[1])?$array[1]:null
          ]; //If you're array is bigger than 2 elements you may need to loop here.
      },$replaced)); //Split sentences on the newlines.
      

      这是一个例子:

      http://sandbox.onlinephpfunctions.com/code/b2e2ceef17152e9a888a7b68fab3acb2e9f10fe3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 2011-11-29
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        相关资源
        最近更新 更多