我有一个由以下html组成的字符串:
<p> </p>
<h2>Content</h2>
<p>Content</p>
<h2>Content</h2>
<p>Content</p>
我如何才能完全删除第一个元素(即使它是内容),并让我剩下字符串的其余部分?
应该注意,第一个元素可以是任何东西或包含任何东西。
答案 0 :(得分:3)
您可以使用DOM库:
$document = DOMDocument::loadHTML( $yourString );
$childToRemove = $document->getElementsByTagName('p')->item(0);
$childToRemove->parentNode->removeChild($childToRemove);
//get the string
return $document->saveHTML();
答案 1 :(得分:0)
您可以在换行符上explode
,并使用array_shift
删除第一个元素:
$html = '<p> </p>
<h2>Content</h2>
<p>Content</p>
<h2>Content</h2>
<p>Content</p>';
$lines = explode(PHP_EOL, $html); // break into lines
array_shift($lines); // remove first element
$newHtml = implode(PHP_EOL, $lines); // rejoin lines
echo $newHtml;
答案 2 :(得分:0)
您可以使用类似这样的内容:
$split = explode("<h2>", $str);
unset($split[0]);
$str = "<h2>" + implode("<h2>", $split);
答案 3 :(得分:0)
DOM操作可能是最好的选择,但是以下正则表达式将替换其找到的标签。
[OperationContract(Name = "MyMethod")]
public CustomOutput MyMethod(CustomInput inp){}
[DataContract(Namespace = "")]
public class CustomInput
{
[DataMember(Name = "x")]
public string x { get; set; }
}
本质上,匹配[DataContract(Namespace = "")]
public class CustomInput
{
[DataMember(Name = "x")]
public string x { get; set; }
}
class Program {
private const string URL2 = "http://.../MyMethod";
static void Main(string[] args)
{
HttpClient client = new HttpClient();
string str = JsonConvert.SerializeObject(new CustomInput () { x = "pippo" });
HttpContent content = new StringContent(str, Encoding.UTF8, "application/json");
HttpResponseMessage response = client.PostAsync(URL2, content).Result; // Blocking call!
if (response.IsSuccessStatusCode)
{
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
}
和所有内容,直到找到<[^/]*/.*>
,这样它就可以用于自闭标签,例如<
或标准/.*>
,但不会成功不适用于<br/>
之类的未封闭HTML标记。
对于preg_replace,您可以指定第4个参数以将其限制为仅一个替换:
<p> </p>