Php 获取之间的字符串-查找所有匹配项
它在两个文本字符串(html或其他)之间查找数据 如何更改它以查找所有事件?每次出现$start[一些随机数据]$end之间的每个数据。我想要文档的所有[一些随机数据](总是不同的数据) 一种可能的办法:Php 获取之间的字符串-查找所有匹配项,php,Php,它在两个文本字符串(html或其他)之间查找数据 如何更改它以查找所有事件?每次出现$start[一些随机数据]$end之间的每个数据。我想要文档的所有[一些随机数据](总是不同的数据) 一种可能的办法: function getContents($str, $startDelimiter, $endDelimiter) { $contents = array(); $startDelimiterLength = strlen($startDelimiter); $endDelimi
function getContents($str, $startDelimiter, $endDelimiter) {
$contents = array();
$startDelimiterLength = strlen($startDelimiter);
$endDelimiterLength = strlen($endDelimiter);
$startFrom = $contentStart = $contentEnd = 0;
while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
$contentStart += $startDelimiterLength;
$contentEnd = strpos($str, $endDelimiter, $contentStart);
if (false === $contentEnd) {
break;
}
$contents[] = substr($str, $contentStart, $contentEnd - $contentStart);
$startFrom = $contentEnd + $endDelimiterLength;
}
return $contents;
}
用法:
$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>';
print_r( getContents($sample, '<start>', '<end>') );
/*
Array
(
[0] => One
[1] => TwoTwo
[2] => Four
[3] => Five
)
*/
$str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation.";
$cas = get_delimited_strings($str, "[", "]");
$sample='oneaaatwotwoThreeFour5';
打印(获取内容($sample,,'');
/*
排列
(
[0]=>一个
[1] =>two-two
[2] =>四个
[3] =>五个
)
*/
.您可以使用regex执行此操作:
function getStringsBetween($string, $start, $end)
{
$pattern = sprintf(
'/%s(.*?)%s/',
preg_quote($start),
preg_quote($end)
);
preg_match_all($pattern, $string, $matches);
return $matches[1];
}
我还需要模式之外的文本。所以我把答案从上面的raina77ow改了一点:
function get_delimited_strings($str, $startDelimiter, $endDelimiter) {
$contents = array();
$startDelimiterLength = strlen($startDelimiter);
$endDelimiterLength = strlen($endDelimiter);
$startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0;
while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
$contentStart += $startDelimiterLength;
$contentEnd = strpos($str, $endDelimiter, $contentStart);
$outEnd = $contentStart - 1;
if (false === $contentEnd) {
break;
}
$contents['in'][] = substr($str, $contentStart, $contentEnd - $contentStart);
$contents['out'][] = substr($str, $outStart, $outEnd - $outStart);
$startFrom = $contentEnd + $endDelimiterLength;
$outStart = $startFrom;
}
$contents['out'][] = substr($str, $outStart, $contentEnd - $outStart);
return $contents;
}
用法:
$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>';
print_r( getContents($sample, '<start>', '<end>') );
/*
Array
(
[0] => One
[1] => TwoTwo
[2] => Four
[3] => Five
)
*/
$str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation.";
$cas = get_delimited_strings($str, "[", "]");
给出:
array(2) {
["in"]=> array(3) {
[0]=> string(4) "2 mm"
[1]=> string(7) "1,25 mm"
[2]=> string(6) "0,1 mm"
}
["out"]=> array(4) {
[0]=> string(21) "Bore layer thickness "
[1]=> string(12) " instead of "
[2]=> string(6) " with "
[3]=> string(10) " deviation"
}
}
我需要找到特定的第一个和最后一个标记之间的所有这些事件,并以某种方式更改它们,然后返回更改的字符串 因此,我在函数之后向raina77ow方法添加了这个小代码
$sample = '<start>One<end> aaa <start>TwoTwo<end> Three <start>Four<end> aaaaa <start>Five<end>';
$sample_temp = getContents($sample, '<start>', '<end>');
$i = 1;
foreach($sample_temp as $value) {
$value2 = $value.'-'.$i; //there you can change the variable
$sample=str_replace('<start>'.$value.'<end>',$value2,$sample);
$i = ++$i;
}
echo $sample;
$sample='1aaa2234aaaaa5';
$sample_temp=getContents($sample,,'');
$i=1;
foreach($value作为$sample_temp){
$value2=$value.'-'.$i;//在那里可以更改变量
$sample=str_replace(“.$value.”,$value2,$sample);
$i=+$i;
}
echo$样本;
现在,output sample已删除标记,它们之间的所有字符串都添加了如下编号:
1-1 aaa 2-2-3 aaa 5-4
但是你可以对他们做任何其他的事情。也许对某人会有帮助。我喜欢用explode在两条线之间画线。此函数也适用于多次出现
function GetIn($str,$start,$end){
$p1 = explode($start,$str);
for($i=1;$i<count($p1);$i++){
$p2 = explode($end,$p1[$i]);
$p[] = $p2[0];
}
return $p;
}
函数GetIn($str,$start,$end){
$p1=爆炸($start$str);
对于($i=1;$i这里有一些很好的解决方案,但是对于从HTML中提取部分代码,这是我现在的问题,因为我需要在压缩HTML之前从HTML中提取脚本块。因此,在@raina77ow original solution的基础上,由@Cas Tuyn扩展,我得到了这个解决方案:
$test_strings = [
'0<p>a</p>1<p>b</p>2<p>c</p>3',
'0<p>a</p>1<p>b</p>2<p>c</p>',
'<p>a</p>1<p>b</p>2<p>c</p>3',
'<p>a</p>1<p>b</p>2<p>c</p>',
'<p></p>1<p>b'
];
/**
* Seperate a block of code by sub blocks. Example, removing all <script>...<script> tags from HTML kode
*
* @param string $str, text block
* @param string $startDelimiter, string to match for start of block to be extracted
* @param string $endDelimiter, string to match for ending the block to be extracted
* @return array [all full blocks, whats left of string]
*/
function getDelimitedStrings($str, $startDelimiter, $endDelimiter) {
$contents = array();
$startDelimiterLength = strlen($startDelimiter);
$endDelimiterLength = strlen($endDelimiter);
$startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0;
while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
$contentStart += $startDelimiterLength;
$contentEnd = strpos($str, $endDelimiter, $contentStart);
$outEnd = $contentStart - 1;
if (false === $contentEnd) {
break;
}
$contents['in'][] = substr($str, ($contentStart-$startDelimiterLength), ($contentEnd + ($startDelimiterLength*2) +1) - $contentStart);
if( $outStart ){
$contents['out'][] = substr($str, ($outStart+$startDelimiterLength+1), $outEnd - $outStart - ($startDelimiterLength*2));
} else if( ($outEnd - $outStart - ($startDelimiterLength-1)) > 0 ){
$contents['out'][] = substr($str, $outStart, $outEnd - $outStart - ($startDelimiterLength-1));
}
$startFrom = $contentEnd + $endDelimiterLength;
$startFrom = $contentEnd;
$outStart = $startFrom;
}
$total_length = strlen($str);
$current_position = $outStart + $startDelimiterLength + 1;
if( $current_position < $total_length )
$contents['out'][] = substr($str, $current_position);
return $contents;
}
foreach($test_strings AS $string){
var_dump( getDelimitedStrings($string, '<p>', '</p>') );
}
$test\u字符串=[
“0a1b2c3”,
“0a1b2c”,
“a1b2c3”,
“a1b2c”,
“1b”
];
/**
*按子块分隔代码块。例如,从HTML kode中删除所有…标记
*
*@param string$str,文本块
*@param string$startDelimiter,与要提取的块的开头匹配的字符串
*@param string$endDelimiter,用于结束要提取的块的匹配字符串
*@return数组[全部满块,字符串剩余部分]
*/
函数getDelimitedString($str、$startDelimiter、$endDelimiter){
$contents=array();
$startDelimiterLength=strlen($startDelimiter);
$endDelimiterLength=strlen($endDelimiter);
$startFrom=$contentStart=$contentEnd=$outStart=$outEnd=0;
while(false!==($contentStart=strpos($str、$startDelimiter、$startFrom))){
$contentStart+=$startDelimiterLength;
$contentEnd=strpos($str,$endDelimiter,$contentStart);
$outEnd=$contentStart-1;
if(false==$contentEnd){
打破
}
$contents['in'][]=substr($contentStart-$startDelimiterLength),($contentEnd+($startDelimiterLength*2)+1)-$contentStart);
如果($超过部分){
$contents['out'][]=substr($str,($outStart+$startDelimiterLength+1),$outEnd-$outStart-($startDelimiterLength*2));
}如果($outEnd-$outStart-($startDelimiterLength-1))>0,则为else{
$contents['out'][]=substr($str,$outStart,$outEnd-$outStart-($startDelimiterLength-1));
}
$startFrom=$contentEnd+$endDelimiterLength;
$startFrom=$contentEnd;
$outStart=$startFrom;
}
$total_length=strlen($str);
$current_position=$outStart+$startDelimiterLength+1;
if($当前位置<$总长度)
$contents['out'][]=substr($str,$current_position);
返回$contents;
}
foreach($test_字符串作为$string){
变量转储(getDelimitedString($string,“”,“”);
}
这将使用可能的innerHTML提取所有元素,并给出以下结果:
array (size=2)
'in' => array (size=3)
0 => string '<p>a</p>' (length=8)
1 => string '<p>b</p>' (length=8)
2 => string '<p>c</p>' (length=8)
'out' => array (size=4)
0 => string '0' (length=1)
1 => string '1' (length=1)
2 => string '2' (length=1)
3 => string '3' (length=1)
array (size=2)
'in' => array (size=3)
0 => string '<p>a</p>' (length=8)
1 => string '<p>b</p>' (length=8)
2 => string '<p>c</p>' (length=8)
'out' => array (size=3)
0 => string '0' (length=1)
1 => string '1' (length=1)
2 => string '2' (length=1)
array (size=2)
'in' => array (size=3)
0 => string '<p>a</p>' (length=8)
1 => string '<p>b</p>' (length=8)
2 => string '<p>c</p>' (length=8)
'out' => array (size=3)
0 => string '1' (length=1)
1 => string '2' (length=1)
2 => string '3' (length=1)
array (size=2)
'in' => array (size=3)
0 => string '<p>a</p>' (length=8)
1 => string '<p>b</p>' (length=8)
2 => string '<p>c</p>' (length=8)
'out' => array (size=2)
0 => string '1' (length=1)
1 => string '2' (length=1)
array (size=2)
'in' => array (size=1)
0 => string '<p></p>' (length=7)
'out' => array (size=1)
0 => string '1<p>b' (length=5)
数组(大小=2)
'在'=>数组中(大小=3)
0=>字符串“a”(长度=8)
1=>字符串“b”(长度=8)
2=>字符串“c”(长度=8)
'out'=>数组(大小=4)
0=>字符串“0”(长度=1)
1=>字符串“1”(长度=1)
2=>字符串“2”(长度=1)
3=>字符串“3”(长度=1)
数组(大小=2)
'在'=>数组中(大小=3)
0=>字符串“a”(长度=8)
1=>字符串“b”(长度=8)
2=>字符串“c”(长度=8)
'out'=>数组(大小=3)
0=>字符串“0”(长度=1)
1=>字符串“1”(长度=1)
2=>字符串“2”(长度=1)
数组(大小=2)
'在'=>数组中(大小=3)
0=>字符串“a”(长度=8)
1=>字符串“b”(长度=8)
2=>字符串“c”(长度=8)
'out'=>数组(大小=3)
0=>字符串“1”(长度=1)
1=>字符串“2”(长度=1)
2=>字符串“3”(长度=1)
数组(大小=2)
'在'=>数组中(大小=3)
0=>字符串“a”(长度=8)
1=>字符串“b”(长度=8)
2=>字符串“c”(长度=8)
'out'=>数组(大小=2)
0=>字符串“1”(长度=1)
1=>字符串“2”(长度=1)
数组(大小=2)
'在'=>数组中(大小=1)
0=>字符串“”(长度=7)
'out'=>数组(大小=1)
0=>字符串“1b”(长度=5)
您可以在这里看到一个演示:您需要数据(字符串)吗您文档的计数器??要捕获更多,您需要转到正则表达式。请参阅我查看了preg_match_all,但我不知道如何生成正则表达式。Rajib-我不知道您的意思?我希望函数返回一个引用数组。如果数据看起来像
STARTfooSTARTbarENDbazEND
,您希望函数做什么?谢谢你太多了!正是我想要的!你救了我的命,伙计!或者至少花了很多时间测试和重新测试xP。非常感谢!:)有人能解释一下吗